многопоточность sqlite3 в целевом c

Я запускаю фоновый поток в моем приложении с dispatch_async, и иногда мой основной поток и фоновый поток одновременно обращаются к базе данных, и это приводило к ошибке базы данных, и я пытался ее решить с помощью sqlite3_threadsafe (), которая всегда возвращала 2 то есть, я не могу использовать одно и то же соединение с базой данных в двух потоках, и я хочу, чтобы оно вернулось 1 Кто-нибудь может мне помочь в этом отношении

 Hot Licks08 мая 2012 г., 05:14
Вы не можете получить доступ к базе данных SQLIte одновременно из двух разных потоков.

Ответы на вопрос(2)

что вы придерживаетесь неправильного подхода. SQLite не является надежно защищенным от потоков, независимо от того, как вы его компилируете & # x2014; увидетьFAQ, Даже если SQLite скомпилирован для обеспечения безопасности потоков, одна и та же база данных не может использоваться из нескольких потоков, если какие-либо транзакции ожидают выполнения или какие-либо операторы остаются незавершенными.

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

 user118420208 мая 2012 г., 06:46
@ Томми спасибо за ответ :)
 08 мая 2012 г., 05:18
Решение FMDB делает именно это, создает очередь только для взаимодействия с базой данных.
 08 мая 2012 г., 05:35
Затопление SQLite командами может привести к ошибкам SQLITE_BUSY. Лучше всего шагать по тем командам и по возможности избегать многопоточности.

поэтому вы всегда находитесь в главном потоке при доступе к хранилищу sqlite.

dispatch_async(dispatch_get_main_queue(), ^ {
    //code goes here
});
 17 янв. 2015 г., 18:10
Вероятно, для этого лучше использовать выделенную настраиваемую последовательную очередь, как предложил Томми, а не рисковать блокировкой / блокировкой основной очереди.

Ваш ответ на вопрос