在我的主要活动的onCreate()方法中,我调用了我的dbManager的构造函数,我调用了创建sqliteOpenHelper实例的open函数,而不是在其上调用getWritableDatabase().
在UIThread中,我将记录添加到数据库并将这些记录保存到ArrayList.另外两个线程检查ArrayList做什么,然后更新列表和数据库.
现在我想在UI中添加一个按钮,使用AsyncTask删除数据库和列表记录.
我已经读过sqliteOpenHelper对象保存在一个数据库连接上.因此,如果有一个帮助程序实例,则只有一个数据库连接.此连接可以在多个线程中使用,sqliteDatabase对象使用java锁来保持访问序列化.那么如果我在数据库上写了多个线程,那么一个线程会等到前一个线程完成其操作?
添加新功能(全部删除)可能会产生问题,因为我必须避免两个线程中的一个尝试编辑不再存在的记录.我怎样才能实现目标?谢谢.
最佳答案
数据库:
原文链接:https://www.f2er.com/android/430855.html只要您只使用一个帮助程序,就可以保证线程安全,而无需执行任何操作.
在多线程应用程序中,您只需要在创建帮助程序时进行同步.
如果要定义临界区(多个原子操作),可以使用transacion.
使用getWritableDatabase()和close(false)包装每个调用:
public void doSomething() {
sqliteDatabase tdb = getWritableDatabase();
dbInstance.writeSomething(tdb,1);
close(false);
}
通过这种方式,我有多个线程读取和写入数据库没有任何问题.
你的app逻辑:
使用内存来跟踪对象状态,并仅将数据库用作存储.因此,如果一个线程从数据库中删除行 – 您可以立即更新内存中的对象,并相应地处理您的UI.
如果你的数据非常大,那么你只能在内存中保留一个脏行id的SparseArray.
在此处同步某些操作可能很有用.