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



我想创建一个离线词典应用程序,有时需要更新,旧数据库会被新数据库取代。这就是我想做的,我用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中删除旧数据库并创建新数据库不是正确的解决方案。必须迁移较旧的数据。如果你对维护版本1的旧数据不感兴趣,那也没关系。

正确的方法是使用onUpgrade来修改架构。大多数情况下,更改模式需要重新创建表。在这种情况下,遵循以下方法

  1. 重命名要更改为某个临时表的现有表(比如tablexyz)名称(比如temp_table_xyz)
  2. 使用新模式创建表(tablexyz)
  3. 将临时表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);
  }

这对于一些数据库来说非常有用,因为我们在更新时不需要旧数据。

最新更新