Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 目标c中的sqlite3多线程_Iphone_Objective C_Ios_Multithreading_Sqlite - Fatal编程技术网

Iphone 目标c中的sqlite3多线程

Iphone 目标c中的sqlite3多线程,iphone,objective-c,ios,multithreading,sqlite,Iphone,Objective C,Ios,Multithreading,Sqlite,我在我的应用程序中运行了一个带有dispatch_async的后台线程,有时我的主线程和后台线程都同时访问数据库,这给了我一个数据库错误,我尝试使用sqlite3_threadsafe()解决它,它总是返回2,即,我不能在两个线程中使用同一个数据库连接,我希望它返回1在这方面有人能帮助我吗您可以将所有access语句添加到,因此在访问sqlite存储时,您始终处于主线程 dispatch_async(dispatch_get_main_queue(), ^ { //code goes h

我在我的应用程序中运行了一个带有dispatch_async的后台线程,有时我的主线程和后台线程都同时访问数据库,这给了我一个数据库错误,我尝试使用sqlite3_threadsafe()解决它,它总是返回2,即,我不能在两个线程中使用同一个数据库连接,我希望它返回1在这方面有人能帮助我吗

您可以将所有access语句添加到,因此在访问sqlite存储时,您始终处于主线程

dispatch_async(dispatch_get_main_queue(), ^ {
    //code goes here
});

我认为你走错了路。无论您如何编译SQLite,它都不是可靠的线程安全的-请参阅。即使为了线程安全而编译SQLite,如果任何事务处于挂起状态或任何语句保持未完成状态,也可能无法从多个线程使用同一数据库


在我看来,上面关于使用Grand Central Dispatch将所有SQLite访问导入串行调度队列的建议是正确的,尽管我更倾向于建议您创建自己的队列,而不是使用主队列,原因很简单,您可以在等待结果时可靠地调度同步。

您不能同时从两个不同的线程访问SQLIte DB。FMDB解决方案正是这样做的,仅为数据库交互创建队列。使用命令淹没SQLite可能会导致SQLite\u BUSY错误。最好调整这些命令的速度,尽可能避免激进的多线程处理。正如Tommy所建议的,最好使用专用的自定义串行队列,而不是冒着阻塞/死锁主队列的风险。