Буду ли я сталкиваться с проблемами параллелизма с sqlite при синхронизации в другом потоке? - PullRequest
0 голосов
/ 06 августа 2011

Когда пользователь запускает мое приложение, я хочу сначала загрузить некоторые данные из Интернета для синхронизации с базой данных sqlite в телефоне.Я делаю это в другой теме.Я знаю, что sqlite не является поточно-ориентированным, поэтому вместо обновления базы данных во 2-м потоке я планирую вернуть основной поток и обновить там базу данных.

Это предотвратит любые проблемы параллелизма с обновлением базы данных sqlite, если я решу сделать это таким образом?Будут ли какие-либо другие проблемы, о которых я должен знать?

Пример:

dispatch_async(dispatch_get_global_queue(0, 0), ^{

  //downloading data...

  dispatch_async(dispatch_get_main_queue(), ^{
     //update database here 
  }
}

1 Ответ

0 голосов
/ 06 августа 2011

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

Однако при одновременном доступе к базе данных SQLiteиз нескольких потоков «проигравшие» потоки, скорее всего, получат ошибку «База данных заблокирована».Вы можете справиться с этим, задержав на короткое время, а затем повторив попытку, или применив отдельный протокол блокировки для доступа к базе данных.

Если вы можете каким-либо образом организовать выполнение всех обращений из одного потока, ошибки «База данных заблокирована»не должно происходить, и БД SQLite должна быть «счастливой».Однако помните, что «длительные» операции не должны выполняться в основном потоке / пользовательском интерфейсе, поэтому в основном потоке не следует отправлять сложные запросы или обрабатывать большое количество записей за одну операцию.

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