【问题标题】:SQLiteOpenHelper onUpgrade getting called multiple timesSQLiteOpenHelper onUpgrade 被多次调用
【发布时间】:2012-07-16 20:25:14
【问题描述】:

我的 android 应用程序中有一个只读数据库,我会定期更新。该应用始终在其资产中携带最新版本的数据库。

我增加了我传递给我的 SQLiteOpenHelper 子类的构造函数的版本号,将它(在这种情况下)提升到版本 4。

我有以下代码:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // copy from assets to local storage; version really doesn't matter;
    // DB will be opened from the target location. 
    copyDataBase();
}

当我调用以获取可读数据库时会调用它:

SQLiteDatabase db = myDBHelper.getReadableDatabase();
// Here db.getVersion() correctly returns "4", the newVersion.
// db is also usable and has the correct data.

但每次我调用 getReadableDatabase onUpgrade 时,都会从 oldVersion=3 调用到 newVersion=4。

任何想法为什么版本不坚持?

【问题讨论】:

  • 这可能有助于查看您的代码,了解您如何从活动中调用这些代码。

标签: java android sqlite


【解决方案1】:

嗯,有几件事。

“copyDataBase()”调用有点可疑,因为它可能会复制一些保存的数据库副本,其中包含旧版本代码。 db.getVersion() 可能正在使用传递给辅助类的构造函数的任何内容,而实际上并未从任何地方读取它。所以我会仔细检查或发布它。

还要确保你确实从你的子类中调用了超级构造函数:

   DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        Log.d("DatabaseHelper", "constructor. Version="+DATABASE_VERSION);
    }

并确保在您的情况下日志输出显示“4”而不是 3。

【讨论】:

  • 谢谢。我没有包含我的 copyDataBase() 调用的副本,因为它实际上只是将字节从我的资产(以前保存的数据库副本)复制到本地存储。 (我实际上是在调用上面的超级构造函数,并且 Log.d 输出“4”,正如预期的那样。)所以如果保存的数据库嵌入了版本代码,我在哪里可以找到它来更改它?谢谢!
  • 啊哈-在这里得到了答案:stackoverflow.com/questions/8030779/…。需要做一个编译指示来设置复制数据库上的版本。谢谢!
【解决方案2】:

这只是一个猜测。我遇到了同样的问题,所以我遇到了这篇文章。后来我意识到我在使用sqLiteDatabase.beginTransaction();sqLiteDatabase.endTransaction(); 但在我结束交易之前没有打电话给sqLiteDatabase.setTransactionSuccessful();。我把它放进去,它修好了。希望这会有所帮助,尽管我知道它已经很晚了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2014-09-21
    • 2018-11-04
    • 2016-09-17
    相关资源
    最近更新 更多