在onCreate()
我的主要活动的方法中,我调用了我的 dbManager 的构造函数,我调用了创建 a 实例的 open 函数,SQLiteOpenHelper
然后调用了getWritableDatabase()
它。在 UIThread 中,我将记录添加到数据库并将这些记录保存到 ArrayList。另外两个线程检查 ArrayList 做的事情,然后更新列表和数据库。现在我想在 UI 中添加一个按钮来使用AsyncTask
. 我读过SqliteOpenHelper
对象持有一个数据库连接。因此,如果有一个助手实例,则只有一个数据库连接。此连接可用于多个线程,并且 SqliteDatabase 对象使用 java 锁来保持访问序列化。所以如果我有多个线程在数据库上写,一个线程会等到前一个线程完成他的操作吗?
添加新功能(全部删除)可能会产生问题,因为我必须避免两个线程之一可能会尝试编辑不再存在的记录。我怎样才能实现我的目标?谢谢。
问问题
6199 次
2 回答
4
数据库:
只要您只使用一个助手,您就可以线程安全,无需执行任何操作。
在多线程应用程序中,您synchronized
只需要创建助手。如果要定义临界区(多个原子操作),可以使用事务处理。用and
包装每个调用:getWritableDatabase()
close(false)
public void doSomething() {
SQLiteDatabase tdb = getWritableDatabase();
dbInstance.writeSomething(tdb, 1);
close(false);
}
通过这种方式,我有多个线程读取和写入数据库没有任何问题。
你的应用逻辑:
使用内存来跟踪对象状态,并且仅将数据库用作存储。因此,如果一个线程从数据库中删除行 - 您可以立即更新内存中的对象,并相应地处理您的用户界面。
如果您的数据非常大,那么您只能在内存中保留一个SparseArray
脏行 ID。
在这里同步一些操作可能很有用。
于 2013-04-30T14:29:00.703 回答
0
所以如果我有多个线程在数据库上写,一个线程会等到前一个线程完成他的操作吗?
不必如此。有关更多详细信息,请参阅此内容。无论如何,这取决于数据库引擎并且应该是透明的。
添加新功能(全部删除)可能会产生问题,因为我必须避免两个线程之一可能会尝试编辑不再存在的记录。我怎样才能实现我的目标?
只有一个线程更新数据库。其他线程只修改ArrayList
-also 注意因为ArrayList
不是线程安全的,考虑使用Collections#synchronizedList()
.
于 2013-04-30T14:37:10.993 回答