Android SQLiteAssetHelper无法将只读数据库从版本1升级到2:

时间:2014-11-02 19:09:35

标签: android sqlite

我想创建一个离线词典应用程序,有时需要更新,旧数据库将被新的替换。这就是我想要做的事情,我使用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

解决方案是什么?

通过清算应用数据,它可以正常工作......

对我不好的英语抱歉......

4 个答案:

答案 0 :(得分:7)

引用the documentation

  

如果您有一个只读数据库或者不关心用户数据丢失,那么每次增加版本号时都可以强制用户访问最新版本的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来修改架构。大多数时候改变模式需要重新创建表。在这种情况下,请遵循以下方法

  1. 将现有表格(比如table_xyz)重命名为某个临时值 名字(比如temp_table_xyz)
  2. 使用新架构
  3. 创建表(table_xyz)
  4. 将临时表temp_table_xyz中的内容复制到 new table_xyz