Ale*_* C. 17 database android ormlite
我实际上正在开发一个使用ORMLite库的应用程序(这很棒btw),但我是初学者使用它.
我有一个关于设备内部数据库更新的问题.
假设有人在Google Play上下载了我的应用.几个月后,我肯定会在一些表中填入新的条目.
当此人正在对应用程序进行更新时,如何使用我的新条目更新数据库并将旧文件保留在其中.
更清楚一点,想象用户在我的应用程序中回答了问题.当我将介绍新问题时,如何在更新我的应用程序时将其插入数据库并保留已经回答的问题?
Gra*_*ray 33
当此人正在对应用程序进行更新时,如何使用我的新条目更新数据库并将旧文件保留在其中.
我们的想法是使用传递给onUpgrade(...)方法的版本号.使用ORMLite,该OrmLiteSqliteOpenHelper.onUpgrade(...)方法采用a oldVersion和newVersionnumber.然后,您可以将转换代码编写到您的应用程序中,该代码能够转换旧格式的数据并更新架构.
有关更多信息,请参阅有关该主题的ORMLite文档:
要引用,您可以执行以下操作:
if (oldVersion < 2) {
// we added the age column in version 2
dao.executeRaw("ALTER TABLE `account` ADD COLUMN age INTEGER;");
}
if (oldVersion < 3) {
// we added the weight column in version 3
dao.executeRaw("ALTER TABLE `account` ADD COLUMN weight INTEGER;");
}
Run Code Online (Sandbox Code Playgroud)
如果您有需要转换的现有数据,那么您应该尽可能在SQL中进行转换.
另一种选择是使Account实体和OldAccount实体指向同一个表名.然后,您可以OldAccount使用它读取实体oldAccountDao,将它们转换为Account实体,然后使用accountDao返回到同一个表来更新它们.你需要注意这里的对象缓存.
我是这样做的:
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1:
updateFromVersion1(database, connectionSource, oldVersion, newVersion);
break;
case 2:
updateFromVersion2(database, connectionSource, oldVersion, newVersion);
break;
default:
// no updates needed
break;
}
}
private void updateFromVersion1(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
// do some stuff here
onUpgrade(database, connectionSource, oldVersion + 1, newVersion);
}
private void updateFromVersion2(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
// do some stuff here
onUpgrade(database, connectionSource, oldVersion + 1, newVersion);
}
Run Code Online (Sandbox Code Playgroud)
这将逐步更新用户db,而不依赖于他来自哪个db版本.
| 归档时间: |
|
| 查看次数: |
18950 次 |
| 最近记录: |