我有一个应用程序,可以将数据插入SQLite数据库。有一个服务线程每隔六十秒运行一次,检查是否满足条件,并在必要时引发警报。类似“日历”应用程序。
我有很多活动,它们都有自己的SQLiteOpenHelper和SQLiteDatabase对象。
该应用程序工作得相当好,但我决定其中一个主要更新应用程序需要一个进度对话框主题 - 这是另一个主题,但如果您告诉我如何使旋转器旋转,那就太好了。不过,它确实显示出来了。
但是为了让其显示,我需要将其放在一个线程中。
创建这个线程后,我开始在日志中收到大量“数据库已锁定”的消息。
我想问题可能与我在后台运行的任务有关,每六十秒运行一次 - 即使在视觉上只需要几秒钟来完成更新,因此我将更新程序的主要写事务放在beginTransaction块中。那是我使用的唯一地方。
一切看起来都很好,但后来我开始在各个地方收到更多关于数据库被锁定的虚假错误。
这促使我进行一些整理,但似乎在我执行第一个beginTransaction之后,我想要进行的任何其他数据库修改都会失败,并报告数据库已锁定,尽管我确实调用了db.close。我甚至关闭了数据库帮助器对象和游标,以确保安全。
我能够清除大部分有关游标仍处于打开状态的警告,例如:
我无法确定是什么导致数据库被锁定,因为所有东西都已经关闭了。
然后我决定删除“beginTransaction”来稳定程序——现在我可以再次浏览我的程序。但是我仍然遇到一些随机的锁定问题。
我有很多活动,它们都有自己的SQLiteOpenHelper和SQLiteDatabase对象。
该应用程序工作得相当好,但我决定其中一个主要更新应用程序需要一个进度对话框主题 - 这是另一个主题,但如果您告诉我如何使旋转器旋转,那就太好了。不过,它确实显示出来了。
但是为了让其显示,我需要将其放在一个线程中。
创建这个线程后,我开始在日志中收到大量“数据库已锁定”的消息。
我想问题可能与我在后台运行的任务有关,每六十秒运行一次 - 即使在视觉上只需要几秒钟来完成更新,因此我将更新程序的主要写事务放在beginTransaction块中。那是我使用的唯一地方。
一切看起来都很好,但后来我开始在各个地方收到更多关于数据库被锁定的虚假错误。
这促使我进行一些整理,但似乎在我执行第一个beginTransaction之后,我想要进行的任何其他数据库修改都会失败,并报告数据库已锁定,尽管我确实调用了db.close。我甚至关闭了数据库帮助器对象和游标,以确保安全。
我能够清除大部分有关游标仍处于打开状态的警告,例如:
E/Database( 678): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
我无法确定是什么导致数据库被锁定,因为所有东西都已经关闭了。
然后我决定删除“beginTransaction”来稳定程序——现在我可以再次浏览我的程序。但是我仍然遇到一些随机的锁定问题。
E/Database( 1304): Failure 5 (database is locked) on 0x26e5d8 when executing 'INSERT INTO
有没有可能找出是什么锁定了数据库?我可以看到哪些内容正在抱怨锁,但不知道是什么在锁定它。
如何处理此类并发数据库更新/读取的最佳方法?我已经阅读了很多关于synchronized和ContentProviders的文章,但必须承认,这对我来说有点困难。
有没有关于“最佳”处理方式的任何提示?
我能否找出是什么在锁定数据库?
谢谢 西蒙