根据 Jaskey 的要求,在此处进一步添加缺失点
数据库版本存储在SQLite 数据库文件中。
catch 是构造函数
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
所以当使用name(第二个参数)调用数据库助手构造函数时,平台会检查数据库是否存在,如果数据库存在,它会从数据库文件头获取版本信息并触发正确的调用返回
正如旧答案中已经解释的那样,如果同名的数据库不存在,则会触发onCreate。
下面的解释用一个例子解释onUpgrade的情况。
假设你的第一个版本的应用程序有DatabaseHelper(扩展SQLiteOpenHelper),构造函数传递版本为1,然后你提供了一个升级后的应用程序,新源代码的版本传递为2,然后在DatabaseHelper构建时自动触发onUpgrade,看到文件已经存在,但版本低于你通过的当前版本。
现在假设您计划提供第三个版本的应用程序,其 db 版本为 3(仅当要修改数据库模式时才会增加 db 版本)。在这种增量升级中,您必须从每个版本增量编写升级逻辑以获得更好的可维护代码
下面的示例伪代码:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion) {
case 1:
//upgrade logic from version 1 to 2
case 2:
//upgrade logic from version 2 to 3
case 3:
//upgrade logic from version 3 to 4
break;
default:
throw new IllegalStateException(
"onUpgrade() with unknown oldVersion " + oldVersion);
}
}
注意1 和2 中缺少的break 语句。这就是我所说的增量升级。
如果旧版本是2,新版本是4,那么逻辑会将数据库从2升级到3再升级到4
如果旧版本是3,新版本是4,它只会运行3到4的升级逻辑