【发布时间】:2013-04-30 14:06:58
【问题描述】:
在我的主要活动的onCreate() 方法中,我调用了我的dbManager 的构造函数,我调用了创建SQLiteOpenHelper 实例的open 函数,然后我调用了getWritableDatabase()。
在 UIThread 中,我将记录添加到数据库并将这些记录保存到 ArrayList。另外两个线程检查 ArrayList 做的事情,然后更新列表和数据库。
现在我想在 UI 中添加一个按钮来使用AsyncTask 删除数据库和列表记录。
我读过SqliteOpenHelper 对象在一个数据库连接上。因此,如果有一个助手实例,则只有一个数据库连接。此连接可用于多个线程,并且 SqliteDatabase 对象使用 java 锁来保持访问序列化。那么如果我有多个线程在数据库上写,一个线程会一直等到前一个线程完成他的操作?
添加新功能(全部删除)可能会产生问题,因为我必须避免两个线程之一可能会尝试编辑不再存在的记录。我怎样才能实现我的目标?谢谢。
【问题讨论】:
-
你应该实现消费者和生产者模式,它会帮助你建立一个请求队列,不要并行写入数据库。
-
取决于你如何实现你的编辑,但是一个sql更新返回n,其中n是修改的项目数,如果不存在与where子句匹配的记录,则完全可以为0。
-
1) 你不应该在 UI 线程上进行数据库操作。 2) 只有一个线程读取/写入 ArrayList。 @IamStalker 为什么不并行写入数据库?
-
因为你必须照顾乐观并发,那是因为 SQL-lite 不支持并发。
-
是的,sqlite本身不支持并发,但是Android的SQLiteOpenHelper却完美支持并发。您只需要确保所有线程都使用同一个实例!
标签: android multithreading sqlite