我对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版本匹配或相反,以便进行恢复?
答案 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
已相应实施。