我想创建一个离线词典应用程序,有时需要更新,旧数据库将被新的替换.这就是我想做的事情,我用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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想更新数据库,在将新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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我编译并运行时,它说:无法将只读数据库从版本1升级到2
解决办法是什么?
通过清除应用数据,它将正常工作......
对不起,我的英语不好...
在我的数据库的第一个版本中,我有三行.以下方法属于扩展的类SQLiteOpenHelper.
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL("CREATE TABLE " + DATABASENAME + " (name TEXT, latitude REAL, longitude REAL);");
}
Run Code Online (Sandbox Code Playgroud)
现在,我已将版本号从1更改为2,并添加了一个新行:
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL("CREATE TABLE " + DATABASENAME + " (name TEXT, latitude REAL, longitude REAL, country TEXT);");
}
Run Code Online (Sandbox Code Playgroud)
我不在乎旧数据库丢失了,所以我在升级时使用它:
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
db.delete(DATABASENAME, null, null);
onCreate(db);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我调用该方法时getReadableDatabase(),应用程序崩溃,导致logcat错误
引起:android.database.sqlite.SQLiteException:无法将只读数据库从版本1升级到2:/data/data/com.myapp.app/databases/mydb
我怎么能阻止这个?
编辑
全班:
public class StationsOpenHelper extends SQLiteOpenHelper {
private static final String DATABASENAME …Run Code Online (Sandbox Code Playgroud)