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