Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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 在objective-C中同步sqlite数据库_Iphone_Objective C_Ios_Xcode_Sqlite - Fatal编程技术网

Iphone 在objective-C中同步sqlite数据库

Iphone 在objective-C中同步sqlite数据库,iphone,objective-c,ios,xcode,sqlite,Iphone,Objective C,Ios,Xcode,Sqlite,我有一个视图,在该视图中,我将从服务器向sqlite数据库插入后台线程中的数据。现在,当用户点击并导航到另一个视图时,我必须从该数据库中读取内容,但我无法获取内容,因为该数据库已经在上一个视图的后台线程中打开,并且它给出错误消息数据库被锁定 注意:这两个操作都在不同的表中,即我在不同的表中写入,并从其他表中读取 sqlite支持多线程吗?如果支持,那么如何从数据库中删除锁?sqlite支持多线程。您可以在线程之间共享您的连接句柄/对象,它们将很好地同步访问 编辑:将sqlite3对象(sqlit

我有一个视图,在该视图中,我将从服务器向sqlite数据库插入后台线程中的数据。现在,当用户点击并导航到另一个视图时,我必须从该数据库中读取内容,但我无法获取内容,因为该数据库已经在上一个视图的后台线程中打开,并且它给出错误消息数据库被锁定

注意:这两个操作都在不同的表中,即我在不同的表中写入,并从其他表中读取


sqlite支持多线程吗?如果支持,那么如何从数据库中删除锁?

sqlite支持多线程。您可以在线程之间共享您的连接句柄/对象,它们将很好地同步访问

编辑:将sqlite3对象(sqlite3_open返回的对象)作为第二个参数传递给线程,而不是在线程中重新打开数据库。大概是这样的:

sqlite3 *MyDatabase; //Initialized somewhere
NSArray *DataForThread = [NSArray arrayWithObjects:
    request,
    [NSValue valueWithPointer: MyDatabase],
    nil];

[self performSelectorInBackground:@selector(processResponseInBackground:)        withObject:DataForThread];
sqlite3 *MyDatabase = [[ThreadData objectAtIndex:1] pointerValue];
在线程内部,恢复SQLite3对象,如下所示:

sqlite3 *MyDatabase; //Initialized somewhere
NSArray *DataForThread = [NSArray arrayWithObjects:
    request,
    [NSValue valueWithPointer: MyDatabase],
    nil];

[self performSelectorInBackground:@selector(processResponseInBackground:)        withObject:DataForThread];
sqlite3 *MyDatabase = [[ThreadData objectAtIndex:1] pointerValue];

SQLite支持多线程。您可以在线程之间共享您的连接句柄/对象,它们将很好地同步访问

编辑:将sqlite3对象(sqlite3_open返回的对象)作为第二个参数传递给线程,而不是在线程中重新打开数据库。大概是这样的:

sqlite3 *MyDatabase; //Initialized somewhere
NSArray *DataForThread = [NSArray arrayWithObjects:
    request,
    [NSValue valueWithPointer: MyDatabase],
    nil];

[self performSelectorInBackground:@selector(processResponseInBackground:)        withObject:DataForThread];
sqlite3 *MyDatabase = [[ThreadData objectAtIndex:1] pointerValue];
在线程内部,恢复SQLite3对象,如下所示:

sqlite3 *MyDatabase; //Initialized somewhere
NSArray *DataForThread = [NSArray arrayWithObjects:
    request,
    [NSValue valueWithPointer: MyDatabase],
    nil];

[self performSelectorInBackground:@selector(processResponseInBackground:)        withObject:DataForThread];
sqlite3 *MyDatabase = [[ThreadData objectAtIndex:1] pointerValue];

SQLite支持多线程,但不支持多线程同时访问数据库

如果您在Objective-C中从多个线程访问SQLite,那么应该使用某种锁定机制来协调对数据库句柄的访问。一个选项是@synchronized关键字

至于在不同线程上进行插入的同时从数据库中读取,您需要有创造性

一种选择是将这两个表放入两个不同的数据库中,并创建两个到它们的不同连接

进一步了解在多线程环境中使用SQLite的本质:


SQLite支持多线程,但不支持多线程同时访问数据库

如果您在Objective-C中从多个线程访问SQLite,那么应该使用某种锁定机制来协调对数据库句柄的访问。一个选项是@synchronized关键字

至于在不同线程上进行插入的同时从数据库中读取,您需要有创造性

一种选择是将这两个表放入两个不同的数据库中,并创建两个到它们的不同连接

进一步了解在多线程环境中使用SQLite的本质:


Sqlite支持多线程,因为编写速度非常快,可以避免并发问题。事实上,在只读查询的情况下不应该有锁问题,但是如果你想写太多。。。您可能会遇到SQLITE_BUSY错误。 您可以通过以下几种方式避免:

或者在同一个线程中执行所有查询,但如果可以的话…没有关于stackoverflow的问题:-

或者,如上所述,将数据库表拆分为两个或多个文件,将具有较少并发访问或只读访问的表分组在一起,并为每个文件创建不同的数据库连接

或者,如上所述,在执行查询的每个方法或代码块上使用线程同步方法,以确保在启动事务时使用BEGIN IMMEDIATE transaction锁定db

或者,使用c api、sqlite\u busy\u处理程序和sqlite\u busy\u超时提供的2个回调来处理sqlite:busy错误

或者,在收到锁定错误后,等待1-2秒并重试,我认为最好接近上面的点


我更喜欢减少并发性,拆分数据库,然后在需要时同步线程访问查询代码。这只是您的选择…

Sqlite支持多线程,因为它的编写速度非常快,可以避免并发问题。事实上,在只读查询的情况下不应该有锁问题,但是如果你想写太多。。。您可能会遇到SQLITE_BUSY错误。 您可以通过以下几种方式避免:

或者在同一个线程中执行所有查询,但如果可以的话…没有关于stackoverflow的问题:-

或者,如上所述,将数据库表拆分为两个或多个文件,将具有较少并发访问或只读访问的表分组在一起,并为每个文件创建不同的数据库连接

或者,如上所述,在执行查询的每个方法或代码块上使用线程同步方法,以确保在启动事务时使用BEGIN IMMEDIATE transaction锁定db

或者,使用c api、sqlite\u busy\u处理程序和sqlite\u busy\u超时提供的2个回调来处理sqlite:busy错误

或者,在收到锁定错误后等待1-2秒并重试,最好接近上述点 我想


我更喜欢减少并发性,拆分数据库,然后在需要时同步线程访问查询代码。这只是你的选择…

@Seve如果你能提供一些代码就好了。首先谢谢你。如何打开数据库并启动后台线程?在第一个视图中,当数据来自服务器时,使用“[self-performSelectorInBackground:@selectorprocessResponseInBackground:withObject:request];”在后台插入数据当我从这个视图导航时,它仍然使用数据库,并且数据库被另一个视图锁定。如何连接到数据库?您使用的是SQLite的C API,还是核心数据,还是什么?一般的想法是将连接作为withObject:参数的一部分传递到线程。但是我不知道你的连接对象是什么。我正在使用sqlite'CAPI并使用sqlite3\u open commond打开数据库。我不知道你在说什么连接对象?@Seve如果你能提供一些代码就好了。首先谢谢你。如何打开数据库并启动后台线程?在第一个视图中,当数据来自服务器时,使用“[self-performSelectorInBackground:@selectorprocessResponseInBackground:withObject:request];”在后台插入数据当我从这个视图导航时,它仍然使用数据库,并且数据库被另一个视图锁定。如何连接到数据库?您使用的是SQLite的C API,还是核心数据,还是什么?一般的想法是将连接作为withObject:参数的一部分传递到线程。但是我不知道你的连接对象是什么。我正在使用sqlite'CAPI并使用sqlite3\u open commond打开数据库。我不知道你在说什么连接对象?