gpt4 book ai didi

java - 两个 AsyncTasks 可以共享同一个 SQLiteDatabase 对象吗?

转载 作者:行者123 更新时间:2023-11-29 10:19:53 25 4
gpt4 key购买 nike

如果他们只对其执行查询呢?像这样的东西:

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

最佳答案

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

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

看这里:

最后一个链接很好。引用 Kevin Galligan 的话:

  • Sqlite takes care of the file level locking. Many threads can read, one can write. The locks prevent more than one writing.
  • Android implements some java locking in SQLiteDatabase to help keep things straight.
  • If you go crazy and hammer the database from many threads, your database will (or should) not be corrupted.

Here’s what’s missing. If you try to write to the database from actual distinct connections at the same time, one will fail. It will not wait till the first is done and then write. It will simply not write your change. Worse, if you don’t call the right version of insert/update on the SQLiteDatabase, you won’t get an exception. You’ll just get a message in your LogCat, and that will be it.

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

关于java - 两个 AsyncTasks 可以共享同一个 SQLiteDatabase 对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8446585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com