我有一个关于免费应用程序的困境,我允许用户将他们的数据(SD卡上的sqlite文件)导入付费应用程序。
完成这些更新后;我意识到如果我需要对数据库进行未来的更改,用户将需要将相同的数据库版本(从免费应用程序)导入到现有版本(付费应用程序)。
现实生活中的例子:
让我们说两个应用的版本1都有1个包含5列的表。我升级到v2,现在1个表有6列。
当潜在用户在付费应用中进行导入以从免费应用中引入数据时,免费应用可能会在数据库版本1上(如果用户最近没有更新应用),付费应用程序将寻找数据库版本2.我认为这会导致启动时崩溃。
如何在导入之前在付费应用中进行这样的检查:(伪代码)
File olddb = oldDb.db; // get the back up file here from SD
int piadAppDBVersion = 2; // check for the current version of the database in paid app
if (olddb.getDatabaseVersion() == getPaidAppDBVersion()) { // made up functions
// allow import;
} else {
// Toast "Your databases are incompatible"
}
所以这两个问题: 1.如果上述代码是确保兼容性的适当解决方案,那么如何做到这一点? 2.如果以上不是我问题的标准解决方案,那么是什么?
附注:我的导入包含一个简单的文件副本:在外部存储上复制后备数据库并覆盖内部存储上的数据库。
答案 0 :(得分:5)
考虑"版本"或"功能"表在 SQLite数据库中。不要害怕将其作为稳定架构的一部分加入;我的许多数据库模式都包含应用脚本更改的日志。
但是,SQLite确实支持PRAGMA user_version
,它也可以用于此目的,虽然它只能存储一个整数值:
pragma schema_version和user_version分别用于设置或获取schema-version和user-version的值。模式版本和用户版本是大端32位有符号整数,分别存储在偏移量为40和60的数据库头中。
模式版本通常只由SQLite在内部操作..
SQLite不会在内部使用用户版本。 应用程序可以出于任何目的使用它。
通过标准Android SQLite API支持user_version PRAGMA ,可以使用SQLiteDatabase.getVersion和setVersion访问;数据库打开后。
答案 1 :(得分:0)
SQLiteDatabase sqlDb = SQLiteDatabase.openDatabase
(db.getPath(), null, SQLiteDatabase.OPEN_READONLY);
if (sqlDb.getVersion()>DBConnect.version)
{
//you have to update app to the last version first
}