【问题标题】:Can two AsyncTasks share the same SQLiteDatabase object?两个 AsyncTask 可以共享同一个 SQLiteDatabase 对象吗?
【发布时间】:2012-01-16 19:26:31
【问题描述】:

如果他们只对它执行查询?比如:

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);
        ...
    }
}

【问题讨论】:

标签: java android multithreading android-asynctask


【解决方案1】:

应用程序中的所有线程都应该使用相同的数据库对象——即使同时读取和写入。 SQLite 使用内部锁定机制适当地处理这个问题。

想要做的是使用多个数据库对象从数据库中读取和写入。这可能会导致数据不一致。

看这里:

最后一个链接很好。引用凯文·加利根的话:

  • Sqlite 负责文件级锁定。许多线程可以读取,一个可以写入。锁可防止多次写入。
  • Android 在 SQLiteDatabase 中实现了一些 java 锁定,以帮助保持正常。
  • 如果您发疯并从多个线程中敲击数据库,您的数据库将(或不应该)损坏。

这是缺少的。如果您尝试同时从实际的不同连接写入数据库,则会失败。它不会等到第一个完成后再写入。它根本不会写你的改变。更糟糕的是,如果您没有在 SQLiteDatabase 上调用正确版本的插入/更新,您将不会收到异常。您只会在 LogCat 中收到一条消息,就是这样。

顺便说一句,Kevin 在 ORMLite 的 Android 方面做了很多工作,我支持 Android 的 Java ORM 包。

【讨论】:

  • 谢谢,我担心如果两个 AsyncTask 同时尝试写入会发生某种“冲突”,但我想你的回答可以解决这个问题。
  • 我有类似的问题,我实际上是同时从两个或多个 AsyncTasks 中读取数据,其中至少有两个被执行OnExecutor(AsyncTask.THREAD_POOL_EXECUTOR).. 我得到以下崩溃“java.lang.IllegalStateException :无法执行此操作,因为连接池已关闭。”.. 猜测它与在每次查询之前获取可读数据库并在其之后关闭它有关,因此 AsyncTasks 重叠并且一个在错误的时刻访问游标:S
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2011-01-10
  • 2021-08-19
  • 1970-01-01
相关资源
最近更新 更多