2012-07-16 70 views
1

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

我增加,我传入构造为我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。

任何想法为什么版本不粘?

+0

这可能有助于查看您的代码,了解如何从您的活动中调用这些代码。 – Nate 2012-07-16 21:17:26

回答

1

好了几件事。

“copyDataBase()”调用有点可疑,因为它可能会复制一些已保存的具有旧版本代码的db副本。 db.getVersion()可能会使用传递给你的helper类的构造函数的内容,而不是从任何地方实际读取它。所以我会仔细检查或张贴它。

另外,还要确保你确实是从您的子类调用构造函数的超:

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

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

+0

谢谢。我没有包含我的copyDataBase()调用的副本,因为它实际上是从我的资产(以前保存的数据库副本)字面上复制字节到本地存储。 (我实际上调用了上面的super构造函数,Log.d输出“4”,如预期的那样)。因此,如果保存的数据库嵌入了版本代码,我会在哪里找到要更改的版本?谢谢! – 2012-07-16 22:54:20

+0

啊哈 - 在这里得到了答案:http://stackoverflow.com/questions/8030779/change-sqlite-database-version-number。需要做一个编译指示来设置复制数据库的版本。谢谢! – 2012-07-16 23:22:40

1

这只是一个猜测。我遇到了同样的问题,所以我遇到了这个帖子。后来我意识到我在使用sqLiteDatabase.beginTransaction();sqLiteDatabase.endTransaction(); ,但在结束交易之前未调用sqLiteDatabase.setTransactionSuccessful();。我把它放进去然后固定它。希望这会有所帮助,尽管我知道它很晚。

+0

你让我的一天,非常感谢你的朋友 – 2016-08-29 13:42:30