【问题标题】:Android: DatabaseObjectNotClosedException in OnUpgarde although its closedAndroid:OnUpgarde 中的 DatabaseObjectNotClosedException 虽然已关闭
【发布时间】:2012-11-29 14:18:36
【问题描述】:

编辑: 我的数据库有 2 个表。一张表是更新后需要保存和恢复的用户数据。另一个表是常量数据,每次更新时都会从 assets 文件夹中加载。

所以当我升级数据库时,我首先将表一保存到外部数据库。然后我用 copyDataBase(); 覆盖数据库,并使用“常量”表,然后将保存的表复制回来。

在我复制数据库之前,我需要关闭它,否则数据很奇怪。我总是得到一个

close() was never explicitly called on database '/data/data/com.myproject/databases/mdb.sqlite' 

在哪里调用 openOrCreateDatabase。 这很奇怪,因为我之前打电话给 close 。我能做什么?

public void onUpgrade(SQLiteDatabase db,
        int oldVersion, int newVersion) {

//save db tables to other db ...

db.close(); 
copyDataBase();
db = SQLiteDatabase.openOrCreateDatabase(databaseFile, null);

//... save back to db
}

谢谢 欧里博尔

【问题讨论】:

  • 不要显示错误发生的WHERE。在copyDataBase();db = SQLiteDatabase.openOrCreateDatabase(databaseFile, null);?您也不会在这些方法中显示任何代码。您希望我们如何帮助您?
  • 我的 copyDataBase() 从这里:reigndesign.com/blog/…。无论如何,它不会做任何与错误消息相关的事情,它只是一个提示,让您感受一下我的功能是做什么的。如前所述,崩溃发生在 openOrCreateDatabase 中

标签: android database exception


【解决方案1】:

我强烈建议不要在执行onUpgrade 时关闭打开的数据库。您正在干预一个明智的行为,这会造成很多麻烦!

您应该考虑其他机制来确定数据库是否已升级并进行备份/复制。

编辑

如果你只想替换 assets 文件夹中的一张表,为什么不直接复制 sdcard 上的数据库,打开连接,将内部的表内容替换为 assets 数据库中的表内容?这可以在 onUpgrade 中完成,而无需关闭内部数据库。

您不应该仅仅为了替换/更新单个表而复制数据库文件。

【讨论】:

  • 你觉得有什么明智的做法?它所做的只是一个简单的 if (version != DATABASE_VERSION) { try { if (version == 0) { onCreate(myDataBase); } else { onUpgrade(myDataBase, 版本, DATABASE_VERSION); } 在事务中
  • 您在 onUpgrade 中调用它?你在做什么似乎很令人困惑......从我读到的内容,我会说你做过或试图做的事情:你做错了。您能否在您的问题中解释您实际尝试实现的目标?
  • 您建议复制表比复制整个数据库要好一些。但我仍然看到 onUpgrade 存在问题。要复制表需要附加 sd 卡数据库。这在 OnUpgrade 的调用函数启动的事务中是不可能的。我可以结束交易,但这不是本意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2014-06-12
  • 2017-11-16
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多