如何直接从.db文件检查数据库版本

时间:2014-08-13 22:09:09

标签: android sqlite

我有一个关于免费应用程序的困境,我允许用户将他们的数据(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.如果以上不是我问题的标准解决方案,那么是什么?

附注:我的导入包含一个简单的文件副本:在外部存储上复制后备数据库并覆盖内部存储上的数据库。

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访问;数据库打开后。

另见Where does Android store SQLite's database version?

答案 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
            }