Могут ли две AsyncTasks использовать один и тот же объект SQLiteDatabase? - PullRequest
1 голос
/ 09 декабря 2011

Если они только выполняют запросы по нему Что-то вроде:

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

1 Ответ

8 голосов
/ 09 декабря 2011

Все ваши потоки в вашем приложении должны использовать один и тот же объект базы данных - даже если чтение и запись ведутся одновременно.SQLite соответствующим образом обрабатывает механизмы внутренней блокировки.

Что вы не хотите сделать, это использовать несколько объектов базы данных для чтения и записи из базы данных.Это может привести к несогласованности данных.

См. Здесь:

Последняя ссылка хорошая.Цитируя Кевина Галлигана:

  • Sqlite заботится о блокировке уровня файла.Многие темы могут читать, можно писать.Блокировки предотвращают более одной записи.
  • Android реализует некоторую java-блокировку в SQLiteDatabase, чтобы упростить задачу.
  • Если вы сходите с ума и забиваете базу данных из множества потоков, ваша база данных будет (илине должен быть испорчен.

Вот чего не хватает.Если вы попытаетесь одновременно выполнить запись в базу данных из разных соединений, произойдет сбой.Это не будет ждать, пока первое будет сделано, а затем напишите.Это просто не будет писать ваши изменения.Хуже того, если вы не вызовете правильную версию вставки / обновления в базе данных SQLiteD, вы не получите исключение.Вы просто получите сообщение в своем LogCat, и это будет оно.

Кроме того, Кевин проделал большую часть работы на стороне Android ORMLite * 1034.* мой пакет Java ORM, который поддерживает Android.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...