我想创建一个离线词典应用程序,有时需要更新,旧数据库将被新的替换。这就是我想要做的事情,我使用SQLiteAssetHelper
图书馆做了类似的事情:
注意: SQLiteAssetHelper
会将数据库从assets文件夹复制到app data文件夹
public class MyDb extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "db.sqlite";
private static final int DATABASE_VERSION = 1;
public MyDb(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
现在我想更新数据库,在将新db.sqlite
文件放入assets
文件夹后,我操纵了我的代码:
public class MyDb extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "db.sqlite";
private static final int DATABASE_VERSION = 2;
public MyDb(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
但是当我编译并运行时,它说:无法将只读数据库从版本1升级到2
解决方案是什么?
通过清算应用数据,它可以正常工作......
对我不好的英语抱歉......
答案 0 :(得分:7)
如果您有一个只读数据库或者不关心用户数据丢失,那么每次增加版本号时都可以强制用户访问最新版本的SQLite数据库(用资产中的一个覆盖本地数据库) )通过调用
setForcedUpgrade()
子类构造函数中的SQLiteAsstHelper
方法。您还可以传递一个参数,该参数是强制升级的版本号。
请注意,这将覆盖现有的本地数据库及其中的所有数据。
您没有从构造函数中调用setForcedUpgrade()
。
答案 1 :(得分:6)
您应该在构造函数之后调用setForcedUpgrade();
:
public class MyDb extends SQLiteAssetHelper {
private static final int DATABASE_VERSION = 2;//+1
public MyDb(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
setForcedUpgrade();
}
}
答案 2 :(得分:2)
由此解决了:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion != newVersion) {
context.deleteDatabase(DATABASE_NAME);
new MyDb(context);
}else
super.onUpgrade(db, oldVersion, newVersion);
}
对于某些数据库非常有用,我们在获取更新时不需要旧数据。
答案 3 :(得分:1)
请注意,删除旧数据库并在onUpgrade中创建新数据库不是正确的解决方案。必须迁移旧数据。如果您对维护旧数据ov版本1不感兴趣,那就没关系。
正确的方法是使用onUpgrade来修改架构。大多数时候改变模式需要重新创建表。在这种情况下,请遵循以下方法