Android数据库升级总结

1、数据库升级概念

在开发应用时,我们经常会用数据库来保存数据。 但是随着应用的版本不断升级, 之前的数据库结构可能不太适应当前版本, 这时就需要升级数据库, 使之符合当前需求。类似应用升级, 数据库的升级也需要version来标明。 不同的是应用版本的升级, 只需更改AndroidManifest.xml文件中的versionCode与versionName即可。 但是数据库的升级需要在代码里面修改。

2、数据库升级原理

2.1、升级原理分析

在使用数据库时, 我们会定义一个扩展了抽象类SQLiteOpenHelper的子类。例如,

图1

图1 DatabaseHelper

其中, 构造函数调用了父类即SQLiteOpenHelper的构造方法, 其中包含了一个version的参数。这个参数即是数据库的版本。 所以,我们可以通过修改version来实现数据库的升级。 一般的,在数据库初始开发时设置为1,然后每次升级时递增。
其次,在SQLiteOpenHelper中还定义了两个抽象的方法,onCreate( )、onUpgrade( )。
这两个方法顾名知义对应着数据库的创建和升级两个过程。我们一般在onCreate( )方法中进行创建表等操作,在onUpgrade( )方法中进行修改表等操作。 例如,

图2

图2 实现的方法

当在某个应用1.0版时, 设置构造方法中的参数version为1。我们在使用SQLiteOpenHelper访问数据库时,系统会读取该参数。如果该参数为0,表示之前没有数据库文件, 则将version为1写入数据库,并调用onCreate( )方法创建数据库。当需要升级数据库时将version设置为2。在应用访问数据库时就会去读取数据库中存储的数据库版本,如果发现不一样(变大), 则会调用onUpgrade( )方法,触发升级逻辑。

2.2、具体代码分析

2.2.1、SQLiteOpenHelper类构造方法

图3

图3 SQLiteOpenHelper构造方法

其中, CursorFactory和DatabaseErrorHandler一般是传null。 我们可以看到,构造SQLiteOpenHelper对象时如果数据库版本号低于1是会报异常的。

2.2.2、SQLiteOpenHelper的使用

在访问数据库时,我们一般会new一个SQLiteHelper的对象。

图4

图4 SQLiteOpenHelper的使用

其中,getWritableDatabase( )会调用getDatabaseLocked(false)方法,在该方法中实现了对数据库版本检查和升级等的逻辑。其中部分代码如下,

图5

图5 数据库升级逻辑

我们可以看到,系统会先调用getVersion( )获取当前数据库版本。如果没有数据库文件存在,则getVersion( )方法会返回0. 从而调用onCreate( )方法。如果version不为0,则会比较当前version与数据库中保存的version值从而决定是升级还是降级。对于降级系统会抛出异常,如下

图6

图6 降级逻辑

而升级的操作,则需要我们在子类中实现。最后,系统会将当前数据库版本version值保存到数据库中。

3、数据库升级注意事项

在升级数据库时,如果我们需要在原有表的基础上增加一个字段,那么需要注意的是,一定要为老数据的的新添字段设置默认值。否则,在查询该数据表时会返回空。增加列并设置默认值的方法如下:

图7

图7 增加字段并设置默认值

其次,数据库的升级是对于升级用户的而言的。但是对于新用户系统会新创建数据库,所以在增加字段的同时也要在onCreate( )方法中修改创建该表的SQL语句,从而增加字段。这样那么不管是升级用户还是新用户,数据库中的该表都增加了该字段。

4、结论

1.数据库的升级是通过修改version值实现的。
2.新用户会通过onCreate()方法产生数据库。对于升级用户而言,如果没有升级数据库,则不会进行数据库创建及升级操作。如果升级了数据库,则会调用onUpgrade( )方法。
3.应用的升级与数据库升级无必然的联系。

5、参考

  1. 网址:http://blog.csdn.net/jiangwei0910410003/article/details/39670813

猜你喜欢

转载自blog.csdn.net/honeysx/article/details/50865649
今日推荐