我实际上正在开发一个使用ORMLite库的应用程序(顺便说一句,这很棒),但我是使用它的初学者。
我有一个关于设备内部数据库更新的问题。
假设有人在Google Play上下载我的应用程序。几个月后,我肯定会用新条目填充一些表。
当这个人在更新应用程序时,我如何才能用我的新条目更新数据库,并将旧条目保留在其中。
更清楚地说,假设用户在我的应用程序中回答了问题。当我将引入新的问题时,我如何在他更新我的应用程序时将它们插入到数据库中,并保持已经回答的问题?
发布于 2013-06-06 01:50:55
当这个人更新应用程序时,我如何才能用我的新条目更新数据库,并将旧条目保留在其中。
其思想是使用传递给onUpgrade(...)
方法的版本号。对于ORMLite,OrmLiteSqliteOpenHelper.onUpgrade(...)
方法接受oldVersion
和newVersion
编号。然后,您可以将转换代码编写到您的应用程序中,以便能够从旧格式转换数据并更新架构。
有关详细信息,请参阅ORMLite docs on upgrading your schema。
引用一下,你可以这样做:
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;");
}
如果您有需要转换的现有数据,则应尽可能使用SQL进行转换。
另一种选择是让一个Account
实体和一个OldAccount
实体指向相同的表名。然后,您可以使用oldAccountDao
读入OldAccount
实体,将它们转换为Account
实体,然后使用accountDao
将它们更新回同一个表。你需要小心这里的对象缓存。
发布于 2013-11-24 09:32:16
我这样做:
@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);
}
这将独立于他将要到来的db版本来递增地更新用户db。
发布于 2012-12-09 06:35:39
资料不多,不清楚你的表结构是否有变化。
a)如果不更改数据库结构,则为。
1在新版本的程序中,当您开始用当前版本(参见PackageManager.getPackageInfo)检查以前保存的版本(例如,在首选项中)时
saved =0-用户刚刚安装了新版本
已保存<当前-用户更新程序
2将新数据添加到基础中
3在首选项上保存当前版本
b)如果表结构已更改(添加或删除字段),则为
1增加数据库的版本号(请参阅extends类)
2当用户第一次运行你的程序时,方法'onUpgrade‘将被调用(在你的扩展OrmLiteSqliteOpenHelper类中),它将被转换为旧的和新的版本号。
https://stackoverflow.com/questions/13782084
复制相似问题