1、创建数据库
Android 中提供SQLiteOpenHelper类帮助创建一个数据库,SQLiteOpenHelper 是一个抽象类,要创建一个自己的帮助类去继承它,子类至少要实现三个方法:带参的构造方法; onCreate()用来创建数据库;onUpgrade(),用来升级数据库;数据库文件会存放在/data/data//databases/目录下。
public class MydatabaseHelper extends SQLiteOpenHelper {
// 建表语句,数据类型有integer:整型;real:浮点型;text:文本类型;blob:二进制类型
public static final String CREAT_PRESON = "create table person ("
+ "id integer primary key autoincrement," + "name text,"
+ "age integer)";
private Context mContext;
// 参数依次为上下文,数据库名,自定义Cursor一般为null,数据库版本号
public MydatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREAT_PRESON);
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}
在Activity中就可以通过MydatabaseHelper建立数据库
MydatabaseHelper dbHelper = new MydatabaseHelper(this, "School.db",null, 1);
dbHelper.getWritableDatabase();
数据库总要升级的,此时建立一张teacher表,不能写在onCreate()方法里了,就要用到onUpgrade()方法了,只要在MydatabaseHelper的构造方法里将参数修改为一个比1大的数字,onUpgrade()方法就会执行。
MydatabaseHelper中需要修改的代码:
//新增一条建表语句
public static final String CREATE_TEACHER = "create table teacher("
+ "id integer primary key autoincrement," + "name text,"
+ "age integer)";
//onCreate()
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREAT_PRESON);
db.execSQL(CREATE_TEACHER);
}
//onUpgrade
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
db.execSQL("drop table if exists person");
db.execSQL("drop table if exists teacher");
onCreate(db);
}
Activity中需要修改的代码:
MydatabaseHelper dbHelper = new MydatabaseHelper(this, "School.db",null, 2);
2、Android增、删、改、查
增加tom、jerry,年龄为20、21
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// 开始组装第一条数据,第一个参数为列名
values.put("name", "tom");
values.put("age", 20);
// 参数依次为表名,将某些未赋值列自动赋值null,一般直接传入null,ContentValues
db.insert("person", null, values);
values.clear();
// 开始组装第二条数据
values.put("name", "jerry");
values.put("age", 21);
db.insert("person", null, values);
修改tom年龄为25
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("age", 25);
//参数依次为表名,ContentValues,第三第四个参数表条件,第四个参数为字符串数组
db.update("person", values, "name = ?", new String[]{"tom"});
查询person表
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("person", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
} while (cursor.moveToNext());
}
cursor.close();
删除年龄>23的
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("person", "age > ?", new String[] { "23" });
3、sql操作数据库
增:
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("insert into person (name,age) values (?,?)", new String[] { "xiaoming", "21" });
改:
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("update person set age = ? where name = ?", new String[] { "30", "xiaoming" });
查:
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.rawQuery("select * from person",null);
删:
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("delete from person where age > ?",new String[]{"23"});
4、使用事务
事务的特性可以保证让某一系列的操作要么全部完成,要么一个都不会完成。将person表中的数据全部删除,替换成新数据。
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction();// 开启事务
try {
db.delete("person", null, null);
ContentValues values = new ContentValues();
values.put("name", "Yates");
values.put("age", 22);
db.insert("person", null, values);
db.setTransactionSuccessful();// 事务执行成功
} catch (Exception e) {
e.printStackTrace();
} finally {
db.endTransaction();//结束事务
}
5、升级数据库的最佳写法
正式工作中,升级数据库不可能将上个版本的数据库全部删掉,要保证在保留上个版本的数据基础上升级数据库。向上面第二版中要建立新的数据库,可以这么写:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1:
db.execSQL(CREATE_TEACHER);
default:
}
}
如果用户是在第一版的基础上升级,就只会执行db.execSQL(CREATE_TEACHER);如果用户是直接安装的第二版,就会执行onCreate()方法里的
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREAT_PRESON);
db.execSQL(CREATE_TEACHER);
}
这里注意,每一个case后面都是不加break的,当从第一版往上升级时,每一版都会执行。
LitePal框架操作数据库:http://blog.csdn.net/column/details/android-database-pro.html