我想创建一个离线词典应用程序,有时需要更新,旧数据库会被新数据库取代。这就是我想做的,我用SQLiteAssetHelper
库做了这样的事情:
注意:SQLiteAssetHelper
将数据库从资产文件夹复制到应用程序数据文件夹
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
解决方案是什么?
通过清除应用程序数据,它将运行良好。。。
抱歉我英语不好。。。
引用文档:
如果您有只读数据库或不关心用户数据丢失,您可以通过调用
SQLiteAsstHelper
子类构造函数中的setForcedUpgrade()
方法,在每次版本号增加时强制用户使用最新版本的SQLite数据库(用资产中的数据库覆盖本地数据库)。您还可以传递一个参数,该参数是将强制升级的版本号。
请注意,这将覆盖现有的本地数据库及其内的所有数据。
您没有从构造函数调用setForcedUpgrade()
。
您应该在构造函数:之后调用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();
}
}
正确的方法是使用onUpgrade来修改架构。大多数情况下,更改模式需要重新创建表。在这种情况下,遵循以下方法
- 重命名要更改为某个临时表的现有表(比如tablexyz)名称(比如temp_table_xyz)
- 使用新模式创建表(tablexyz)
- 将临时表temptablexyz中的内容复制到新表xyz
通过以下方式解决:
@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);
}
这对于一些数据库来说非常有用,因为我们在更新时不需要旧数据。