在《Android Studio中通过SQLiteDatabase操作数据库》
<https://blog.csdn.net/hou09tian/article/details/80525912>
一文中提到了使用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操作数据库》
<https://blog.csdn.net/hou09tian/article/details/80525912>。