HTC Desire中的数据库锁问题

3

我的应用程序中,一个服务从服务器获取数据并将其插入到表A中。

如果我进入特定的用户界面,我需要从另一个表B中列出数据,如果后台操作正在执行,则会生成数据库锁定异常。我在两个不同的表上同时进行了两个数据库操作。

三星GT15801上运行良好。但是HTC Desire会生成数据库锁定错误。

HTC Desire - 插入过程需要91秒。

三星GT15801 - 插入过程需要21秒。


使用这种方法进行插入现在所需的时间更短,只需要3秒而不是91秒。 - Dev.Sinto
1个回答

14
尝试使用一个SqliteDatabaseHelper并使其成为单个实例。在完成操作后不要关闭SqliteDatabase实例。你可以在数据库上实现锁,具体请参考http://www.sqlite.org/lockingv3.html。如果您开始进行具有多个并发操作的数据库操作,则必须使用...
database.beginTransaction(); /* for start transaction */

在对数据库操作完成之后,你可以使用

database.setTransactionSuccessful();    
database.endTransaction();

如果在事务过程中发生错误,则不要设置 database.setTransactionSuccessful();,这样事务将回滚。

此外,您可以在错误发生时检查数据库是否处于事务中,通过调用 database.inTransaction();,如果返回 true,则表示您正在事务中,否则您不在事务中。

还可以通过调用

(缺失部分无法翻译,请提供完整内容)
database.isDbLockedByCurrentThread();
database.isDbLockedByOtherThreads();

这将返回一个布尔值。

此外,您可以设置是否要在多个线程同时尝试读写数据库时锁定您的数据库:

database.setLockingEnabled(boolean);

上述已删除的方法已经过时,请不要使用。


谢谢您的回复。所以,如果我想在数据库上执行并发操作,那我需要进行加锁操作,对吗?谢谢。 - Dev.Sinto
1
不要使用isDbLockedByOtherThreads(),因为它总是返回false。数据库锁的概念已经不存在了。http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#isDbLockedByOtherThreads() - Muhammad Babar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接