两个AsyncTasks可以共享相同的SQLiteDatabase对象吗?

sor*_*ist 1 java multithreading android android-asynctask

如果他们只对它执行查询?就像是:

private SQLiteDatabase db;

@Override
public void onCreate(Bundle savedInstanceState) {
    db = getWritableDatabse();
}

private Task1 extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... arg0) {
        db.query(doSomething);
        ...
    }
}

private Task2 extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... arg0) {
        db.query(doSomething);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Gra*_*ray 8

应用程序中的所有线程都应使用相同的数据库对象 - 即使同时读写也是如此.SQLite适当地使用内部锁定机制来处理它.

什么,你希望做的是使用多个数据库对象阅读并从数据库中写入.这可能会导致数据不一致.

看这里:

最后一个链接很好.引用凯文加利根:

  • Sqlite负责文件级锁定.很多线程都可以读,有人可以写.锁可防止多次写入.
  • Android在SQLiteDatabase中实现了一些java锁定,以帮助保持正确.
  • 如果你发疯并从许多线程中锤击数据库,你的数据库将(或应该)不会被破坏.

这是缺少的.如果您尝试同时从实际的不同连接写入数据库,则会失败.它不会等到第一个完成然后写.它根本不会写你的改变.更糟的是,如果你不叫插入/更新的正确版本的SQLiteDatabase,你不会得到一个例外.您只需在LogCat中收到一条消息即可.

顺便说一下,Kevin已经完成了ORMLite的Android方面的一些工作,这是我支持Android的Java ORM包.