База данных многопоточная на Android - PullRequest
2 голосов
/ 01 декабря 2011

Я пытаюсь использовать многопоточность одной базы данных sqlite на Android.У меня следующая ситуация:

Действие A: у него есть 10 потоков, которые используют БД, но использует только одну базу данных SQLite

Действие B: имеет 10 потоков, которые используют БД, но использует только одну базу данных SQLiteDatabase

(два объекта SQLiteDatabase разных операций различаются)

Логическое выполнение следующее:

  1. A вызывает B
  2. B вставляет вбаза данных и возвращается к A
  3. A отображает результат
  4. Попытка стереть то, что B вставлено, но не удается.

A может стереть старые вещи, но новоеобъекты, которые B только что вставил, потерпят неудачу, если я перезапущу приложение, A сможет стереть объекты, которые раньше не могли.Должен ли я использовать одну и ту же базу данных SQLiteDatabase для двух операций, и если это так, как передать этот объект в операцию B?

Код потока операции A:

закрытый класс Delete_Task extends AsyncTask {

    private Context mContext;

    private DatabaseManager mDB;

    public DeleteEvent_Task(Context mContext,DatabaseManager DB) {
        this.mContext = mContext;
        this.mDB = DB;
    }

    @Override
    protected Void doInBackground(Long... params) {
        long id = params[0];

        this.mDB.delete(id);

        return null;
    }
}

Код потока действия B:

закрытый класс Update_Task расширяет AsyncTask {

    private Context mContext;


    public Update_Task(Context mContext)
    {
        this.mContext = mContext;
    }

    @Override
    protected Void doInBackground(Event... params) {
        Object e = params[0];

        DatabaseManager DB = new DatabaseManager(this.mContext);

        if (e.getId() <= 0)
        {           
            DB.add(e);
        }
        else
        {

            DB.update(e.getId(), e);
        }
        DB.close();

        return null;
    }       
}

Ответы [ 4 ]

3 голосов
/ 01 декабря 2011

Безусловно, самое простое, что нужно сделать - это открыть соединение с базой данных один раз при запуске приложения и поделиться этим соединением по всему коду, даже не закрывая его.Если вы используете одно соединение, все операции чтения и записи будут правильно сериализованы, поэтому вам не нужно об этом беспокоиться.

1 голос
/ 01 декабря 2011

Я полагаю, что для вас может быть проще инициализировать новую базу данных SQLite для каждого потока, который в ней нуждается, чем для ее передачи. Обязательно закройте его, когда закончите.

Вы пробовали работать в сериализованном режиме ?

1 голос
/ 01 декабря 2011

если вы используете одну и ту же базу данных и открываете и закрываете соединение БД до и после каждого выполненного оператора, это не должно вызывать конфликтов

0 голосов
/ 05 сентября 2013

Совет: проверьте возможность использования OO базы данных. Berkeley DB для Android - полная реализация Java, безопасная, многопоточная, полная документированная и бесплатная.Ваша обработка лучше, чем собственная, потому что вы не выполняете собственный доступ, а выполняете свои задачи на dalvik vm.У меня есть новое приложение с этим, и у меня нет жалоб.

...