在《Android Studio中通过SQLiteDatabase操作数据库》一文中提到了使用SQLiteDatabase类操作数据库的方法。使用该类操作数据库,在创建数据库和更新数据库时,需要考虑到多种情况,例如需要考虑当前数据库是否存在,当前数据库是否已经打开,当前数据库是否有写操作权限等。通过编程实现以上情况的判断是非常繁琐的。使用SQLiteOpenHelper类来创建和更新数据库时,这些情况的判断都包含在该类的代码中,调用者无需再考虑,简化了操作数据库的流程。
1 SQLiteOpenHelper类简介
SQLiteOpenHelper是SQLiteDatabse的一个帮助类,用来管理数据的创建和版本更新。该类是一个抽象类,要使用SQLiteOpenHelper类时必须创建该类的派生类。
2 创建SQLiteOpenHelper类的派生类
在Android Studio中添加一个新类,将该类的名称设置为“DBHelper”,该类派生自SQLiteOpenHelper,如图1所示。
图1 新建SQLiteOpenHelper类的子类
2.1 构造方法
SQLiteOpenHelper类的构造方法格式为
public SQLiteOpenHelper(Context context,
String name,
SQLiteDatabase.CursorFactory factory,
int version)
其中,参数context表示用来打开或创建数据据的上下文;name指定了数据库文件;factory用来创建cursor对象,如果使用默认的factory,则将该参数设置为null;version表示数据库的版本号,该版本号从1开始依次递增。
public static final String DATABASE_NAME = "gcontacts.db";
public static final int DATABASE_VERSION = 2;
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
在自定义的DBHelper类的构造方法中,调用了父类的构造方法。需要注意的时,此时只是指定数据库文件名和数据库的版本号,并没有真正的创建数据库文件。在调用SQLiteOpenHelper类的getWritableDatabase()或者getReadableDatabase()时才会创建或打开数据库文件。
2.2 onCreate()方法
在派生的自类中需要重写onCreate()方法。当数据库文件被首次创建时会调用该函数,也就是在调用调用SQLiteOpenHelper类的getWritableDatabase()或者getReadableDatabase()时会调用该方法。在该方法中主要完成数据库表的创建和记录的添加。
private static final String DATABASE_CREATE = "CREATE TABLE contacts (_id integer primary key autoincrement,username text,password text)";
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
2.3 onUpgrade()方法的编写
当数据库需要更新的时候调用该方法。可以通过该方法实现删除表、添加表或者更新表。该方法的格式为
public abstract void onUpgrade(SQLiteDatabase db,
int oldVersion,
int newVersion)
其中,参数db表示数据库;oldVersion表示旧版本号;newVersion表示新版本号。例如在旧版本中,user表包含username域和password域;如果在新版本的user表中又添加了access域,此时无需手动将旧的数据库文件删除然后再创建新的数据库文件。只需要调用onUpgrade()方法即可。通过指定在“2.1 构造方法”中提到的构造方法的第四个参数的值来调用onUpgrade()方法。例如在旧版本中,使用DBHelper类时,将构造方法的第四个参数设置为1,在新版本中,将该参数改为2即可。此时,onUpgrade()方法会被调用,在该方法中,调用onCreate()方法重新为user表添加access域。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + CONTACTS_TABLE);
onCreate(db);
}
以上代码的作用是,首先判断指定的表是否存在,如果存在,则删除该表;之后调用onCreate()方法重新创建该表,达到更新表的目的。
3 使用SQLiteOpenHelper类的派生类
在“2.1 构造方法”中提到,只有调用了SQLiteOpenHelper类的getWritableDatabase()或者getReadableDatabase()后才能创建数据库。
3.1 创建数据库
SQLiteDatabase contactsDB;
dbHelper = new DBHelper(getContext());
contactsDB = dbHelper.getWritableDatabase();
其中,contactsDB即为创建或打开的数据库。
3.2 操作数据库
在创建或者打开了数据库之后,对数据库的添加、删除、查询、更新等操作,都可以通过在“3.1 创建数据库”中获取到的数据库对象contactsDB来实现。实现的方法详见《Android Studio中通过SQLiteDatabase操作数据库》。