我们在编写数据库应用软件时,需要考虑这样的问题:
在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录
在软件升级的时候,也需要对数据表结构进行更新。
SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。
为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db) 用于初次使用软件时生成数据库表
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)用于升级软件时更新数据库表结构,即 数据库的版本发生变化时会被调用
当在程序当中调用这个类的方法getWritableDatabase()或者 getReadableDatabase()方法取用于操作数据库的SQLiteDatabase实例的时候的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库(在构造函数的时候,并没有真正创建数据库,而是在调用getWritableDatabase或getReadableDatabase数据库时候才真正创建数据库), 接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
调用getWriteableDatabase可能因为磁盘空间或权限问题失 败,所以,一个好的习惯是在捕获异常后提供getReadableDatabase方法的结果,如下面的代码所示: