SQLite DB版本与user_version不同

时间:2017-11-21 10:57:32

标签: android database sqlite

我对DBadapter中的DB版本和数据库Pragma中的user_version的含义感到困惑。

我使用db version = 4进行了测试然后进行备份并使用DB Browser在我的PC中打开它“SQL PRAGMA user_version”返回52!

尝试使用“PRAGMA user_version = 4”匹配版本会生成无法恢复的文件。

使用db version = 5的新测试显示了Pragma user_version 53!

使用db版本构建的任何调试变体< 4会崩溃。

要使用db version = 1,我必须构建一个版本变体并卸载调试版本。

这次在DB Browser中打开的备份文件显示了user_version 49!

将上述备份的user_version从53编辑到49将使数据库恢复正常。

卸载发行版本并返回调试版本我可以使用db version = 1运行app,但user_version仍然是49。

问题:如何使user_version与DB版本匹配或相反,以便进行恢复?

2 个答案:

答案 0 :(得分:1)

我发现解决方案全部归功于DBadapter(来自网站)的愚蠢声明:

 static final int DBVERSION = '1' ; // note single quaotes

这会将版本设置为' 1'的ASCII值。这是整数49.同样' 2'是50,所以PRAGMA user_value设置为49或50 !!只需删除引号并重新安装应用程序修复了我的问题。现在db version和user_version在恢复数据库时是一个关键因素。

答案 1 :(得分:0)

  

问题:如何使user_version与DB版本匹配或以其他方式匹配   为了使恢复成为可能?

强制 user_version 使用(在SQLiteOpenHelper子类打开数据库之前): -

db.setVersion(version);

or via

db.execSQL("PRAGMA user_version=" + Integer.toString(version),null);

其中db是相应的SQLiteDatabase,而version是带有DB Version的int。

或者,您可以覆盖onDowngrade子类的SQLiteOpenHelper方法,这样就不会导致异常: -

  

onDowngrade在API级别11中添加

     

void onDowngrade(SQLiteDatabase db,                   int oldVersion,                   int newVersion)

     

在需要降级数据库时调用。这是严格的   类似于onUpgrade(SQLiteDatabase,int,int)方法,但是被调用   每当当前版本比请求版本更新。但是,这个   方法不是抽象的,因此对于客户来说并不是强制性的   实现它。 如果未被覆盖,默认实施将拒绝   降级并抛出SQLiteException

     

此方法在事务中执行。如果抛出异常,   所有更改都将自动回滚。

然后将user_version设置为数据库版本(如果我没记错的话)。这确实假设onUpgrade已相应实施。