Android - SQLite + SharedPreferences, 2 потока одновременного чтения / записи? - PullRequest
1 голос
/ 13 июля 2010

У меня есть две части программы (собственно приложение и BroadcastReceiver), которые могут попытаться подключиться и изменить базу данных SQLite и файл SharedPreferences.

1) Я знаю, что вы можете создать несколько соединений с одной базой данных SQLite. Я также читал, что SQLite может «заблокировать» базу данных, когда он пытается изменить или прочитать из базы данных (UPDATE, INSERT и т. Д.), Так как мне правильно обрабатывать случай, когда 2 потока пытаются изменить / прочитать одну базу данных SQLite в в то же время?

Сейчас у меня есть этот фрагмент кода в коде / классе соединения с базой данных:

private SQLiteDatabase myDatabase;
public boolean insert(ContentValues columnValueMap) throws Exception
    {
        long result = 0;
        int attempt =0;
        do
        {
            if(!myDatabase.isDbLockedByOtherThreads() && !myDatabase.isDbLockedByCurrentThread())
            {
                synchronized (myDatabase)
                {
                    result=myDatabase.insertOrThrow(TABLE_NAME, TEXT, columnValueMap);
                    if(result ==0 || result == -1)
                    {
                        return false;
                    }
                    return true;
                }
            }
            else
            {
                Thread.sleep(50);
            }
            attempt++;
        }while(attempt<=5);

        throw new Exception("Database Locked!");
    }

2) Должен ли я также беспокоиться об одновременном доступе к файлу SharedPreferences (не имеет значения, какой поток получает доступ первым, я просто беспокоюсь об ошибках)?

Спасибо.

[РЕДАКТИРОВАТЬ] Предлагаемые изменения

public boolean insert(ContentValues columnValueMap) throws Exception
    {
        long result = 0;
        synchronized (myDatabase)
        {
            result=myDatabase.insertOrThrow(TABLE_NAME, SMS_TEXT, columnValueMap);

            if(result ==0 || result == -1)
            {
                return false;
            }
            return true;
        }
    }

1 Ответ

4 голосов
/ 13 июля 2010

Прежде всего, базы данных имеют встроенную поддержку блокировки, и она включена по умолчанию.Если вы хотите быть в безопасности, позвоните SQLiteOpenDatabase.setLockingEnabled(true).

Что касается доступа к общим настройкам, я бы инкапсулировал весь доступ к SharedPreferences (чтение и запись) в небольшие функции, которые все используют синхронизированные.(Убедитесь, что они атомные).

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