SQLiteOpenHelper
在开发SQLite的过程中为了新建一张数据表,因为数据库不允许同名的数据表存在,所以建表前我们要先判断该表是否存在(见:http://blog.youkuaiyun.com/demonliuhui/article/details/66974609)这种处理方式是十分繁琐的。所以Android提供了SQLiteOpenHelper类来优雅的处理这种问题。
实际项目中很少直接用SQliteDatabase的方法操作数据库,都会集成SQLiteOpenHelper开发子类,并通过getReadableDatabase(),getWriteableDatabase()方法打开数据库。
基本用法
在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象。继承和扩展SQLiteOpenHelper类主要做的工作就是重写以下两个方法。
onCreate(SQLiteDatabase db)
当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。如果数据库不存在,会自动铁观音生成一个,然后再调用onCreate()方法,onCreate()方法在初次调用时才会被调用。重写onCreate()方法时,生成数据表结构,初始化数据。
onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version)
当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。只要某次创建SQLiteOpenHelper是指定的版本号高于之前的版本,会自动出触发该方法,更新表结构
getWritableDatabase(),getReadableDatabase()
getWritableDatabase()以写的方式打开数据库,注意:一旦数据库的磁盘空间满了,数据库就只能读不能写,使用该方法就会出错。而getReadableDatabase()方法先以读写的方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续以只读的方法打开。
代码示例
继承SQLiteOpenHelper
该工具类主要是管理数据库的初始化,并允许该应用程序通过该工具类获取SQliteDatabase对象,注意的是该类无论获取多少次对象,都是同一个相同的对象。同理调用getWritableDatabase(),getReadableDatabase()的也是相同的实例。获取该对象后,就可以利用其操作数据库了。
public class MyDBHelper extends SQLiteOpenHelper {
public MyDBHelper(Context context, String name, int version) {
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//重写,新建数据表
db.execSQL("create table dict(_id integer primary key autoincrement, word , detail)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("--------", oldVersion + "------->" + newVersion);
}
//针对该数据表插入方法的封装
public static void insertData(SQLiteDatabase db, String[] agres) {
db.execSQL("insert into dict values(null,?,?)", agres);
}
//针对该数据表查询方法的封装
public static Cursor queryData(SQLiteDatabase db, String key) {
Cursor cursor = db.rawQuery("select * from dict where word like ? or detail like ?", new String[]{"%" + key + "%", "%" + key + "%"});
return cursor;
}
}
获取SQLiteOpenHelper对象
MyDBHelper myDBHelper;
//创建对象,指定版本为1,使用相对路径即可,程序会自动保存在数据文件的database目录下
myDBHelper = new MyDBHelper(this, "myDict.db3", 1);
myDBHelper.getReadableDatabase();//获取操作实例