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