Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
Objective c 如何在不同的线程中正确处理sqlite查询?_Objective C_Database_Multithreading_Performance_Sqlite - Fatal编程技术网

Objective c 如何在不同的线程中正确处理sqlite查询?

Objective c 如何在不同的线程中正确处理sqlite查询?,objective-c,database,multithreading,performance,sqlite,Objective C,Database,Multithreading,Performance,Sqlite,我正在开发一个使用sqlite数据库的iPhone应用程序。应用程序在后台线程中从互联网下载数据,UI位于主线程中。后台下载线程可以在数据库上执行插入、更新和选择。UI层还可以通过执行更新和选择来与数据库交互。如果在后台线程下载时我没有与UI进行大量交互,那么一切都可以正常工作。但是,在下载过程中,当主UI线程上执行大量更新时,我开始遇到问题 在对数据库的每个查询中,我都使用@synchronized语句,但这并不能解决问题。当来自UI的查询和来自反向线程的查询同时执行时,会导致数据丢失。如果主

我正在开发一个使用sqlite数据库的iPhone应用程序。应用程序在后台线程中从互联网下载数据,UI位于主线程中。后台下载线程可以在数据库上执行插入、更新和选择。UI层还可以通过执行更新和选择来与数据库交互。如果在后台线程下载时我没有与UI进行大量交互,那么一切都可以正常工作。但是,在下载过程中,当主UI线程上执行大量更新时,我开始遇到问题

在对数据库的每个查询中,我都使用@synchronized语句,但这并不能解决问题。当来自UI的查询和来自反向线程的查询同时执行时,会导致数据丢失。如果主线程中的数据是分开执行的,那么在主线程中更新数据的性能也和在回溯中一样好

数据库的sqlite3_threadsafe==2; 对于所有查询,我使用的是一个连接,这个问题可能隐藏在这里?

根据您应该调用sqlite3\u config函数并选择一个线程模型。我建议首先尝试序列化SQLITE\u CONFIG\u

还要确保不要将SQLITE\u OPEN\u NOMUTEX标志用于sqlite3\u OPEN\u v2


通常,一个好的做法是将所有写操作序列化到单个线程。一个作家多个读者的模式。我甚至建议避免从主线程访问所有数据库,尽管这可能会很复杂,具体取决于您拥有的遗留代码量。

SQLite的线程模式只保护单个函数调用。但是,每个连接都有一个事务,因此如果有多个线程同时访问数据库,它们仍然会相互干扰。 您应该使用多个连接


如果你想同时读写,考虑使用./p>你为什么手工写SQL?使用FMDB或其他包装器。他们通常也有三份像样的文件。更好的方法是使用核心数据。它有一个优秀的线程模型。我只是继续开发它,另一个开发人员制作了它。