5 回答
TA贡献1805条经验 获得超9个赞
SQLiteOpenHelper
onCreate()
而onUpgrade()
当数据库实际上是打开,例如通过将呼叫回调调用getWritableDatabase()
。创建数据库帮助程序对象本身时,不会打开数据库。
SQLiteOpenHelper
版本数据库文件。版本号是int
传递给构造函数的参数。在数据库文件中,版本号存储在PRAGMA user_version
。
onCreate()
仅在数据库文件不存在且刚刚创建时运行。如果onCreate()
成功返回(不抛出异常),则假定使用请求的版本号创建数据库。作为一种暗示,你不应该自己SQLException
陷入onCreate()
困境。
onUpgrade()
仅在数据库文件存在时调用,但存储的版本号低于构造函数中请求的版本号。本onUpgrade()
应更新表架构所需的版本。
在代码(onCreate()
)中更改表模式时,应确保更新数据库。两种主要方法:
删除旧的数据库文件,以便
onCreate()
再次运行。在开发时,您通常首选这种方法,您可以控制已安装的版本,并且数据丢失不是问题。删除数据库文件的一些方法:卸载应用程序。使用应用程序管理器或
adb uninstall your.package.name
shell。清除申请数据。使用应用程序管理器。
增加数据库版本以便
onUpgrade()
调用。由于需要更多代码,这稍微复杂一些。对于数据丢失不是问题的开发时模式升级,您可以使用
execSQL("DROP TABLE IF EXISTS <tablename>")
in来删除现有表并调用onCreate()
以重新创建数据库。对于已发布的版本,您应该实施数据迁移,
onUpgrade()
以便用户不会丢失数据。
TA贡献1776条经验 获得超12个赞
根据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);
}
}
注意break案例中的缺失语句1和2。这就是增量升级的意思。
说,如果旧版本2和新版本4,那么逻辑将升级数据库2来3,然后到4
如果旧版本3和新版本4,它只是运行升级的逻辑3来4
TA贡献1839条经验 获得超15个赞
onCreate()
当我们第一次创建DataBase(即数据库不存在)时,
onCreate()
使用传入的版本创建数据库SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
onCreate()
方法是创建您定义的表并执行您编写的任何其他代码。但是,只有在应用程序的数据目录(/data/data/your.apps.classpath/databases
)中缺少SQLite文件时,才会调用此方法。如果您已更改代码并在模拟器中重新启动,则不会调用此方法。如果要
onCreate()
运行,则需要使用adb删除SQLite数据库文件。
onUpgrade()
SQLiteOpenHelper
应该调用超级构造函数。onUpgrade()
仅当版本整数大于应用程序中运行的当前版本时,才会调用此方法。如果要
onUpgrade()
调用该方法,则需要在代码中增加版本号。
TA贡献1789条经验 获得超10个赞
可能是我来不及但是我想分享我的简短回答。请检查答案 是否存在同样的问题。它一定会帮到你。没有更深入的规格。
如果您对创建表的语法有信心,那么当您在同一个表中添加新列时可能会发生这种情况...
1)从您的设备卸载并再次运行。
要么
2)设置 - > app - > ClearData
要么
3)更改DATABASE_VERSION
“DatabaseHandler”类(如果添加了新列,则会自动升级)
public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION);}
要么
4)改变DATABASE_NAME
你的“DatabaseHandler”类(我遇到了同样的问题。但是我通过改变成功了DATABASE_NAME
。)
TA贡献2080条经验 获得超4个赞
扩展时要记住的要点 SQLiteOpenHelper
super(context, DBName, null, DBversion);
- 应该调用第一行构造函数覆盖
onCreate
和onUpgrade
(如果需要)onCreate
只有当将被调用getWritableDatabase()
或getReadableDatabase()
执行。这只会DBName
在第一步中指定的时间不可用时调用一次。您可以在onCreate
方法上添加create table query每当您想要添加新表时,只需更改
DBversion
并在onUpgrade
表中执行查询,或者只是卸载然后安装应用程序。
添加回答
举报