我的应用程序中,一个服务从服务器获取数据并将其插入到表A
中。
如果我进入特定的用户界面,我需要从另一个表B
中列出数据,如果后台操作正在执行,则会生成数据库锁定异常。我在两个不同的表上同时进行了两个数据库操作。
三星GT15801上运行良好。但是HTC Desire会生成数据库锁定错误。
HTC Desire - 插入过程需要91秒。
三星GT15801 - 插入过程需要21秒。
我的应用程序中,一个服务从服务器获取数据并将其插入到表A
中。
如果我进入特定的用户界面,我需要从另一个表B
中列出数据,如果后台操作正在执行,则会生成数据库锁定异常。我在两个不同的表上同时进行了两个数据库操作。
三星GT15801上运行良好。但是HTC Desire会生成数据库锁定错误。
HTC Desire - 插入过程需要91秒。
三星GT15801 - 插入过程需要21秒。
database.beginTransaction(); /* for start transaction */
在对数据库操作完成之后,你可以使用
database.setTransactionSuccessful();
database.endTransaction();
如果在事务过程中发生错误,则不要设置 database.setTransactionSuccessful();
,这样事务将回滚。
此外,您可以在错误发生时检查数据库是否处于事务中,通过调用 database.inTransaction();
,如果返回 true,则表示您正在事务中,否则您不在事务中。
还可以通过调用
database.isDbLockedByCurrentThread();
database.isDbLockedByOtherThreads();
这将返回一个布尔值。
此外,您可以设置是否要在多个线程同时尝试读写数据库时锁定您的数据库:
database.setLockingEnabled(boolean);
上述已删除的方法已经过时,请不要使用。
isDbLockedByOtherThreads()
,因为它总是返回false。数据库锁的概念已经不存在了。http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#isDbLockedByOtherThreads() - Muhammad Babar