У меня есть две части программы (собственно приложение и 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;
}
}