'没有数据库通道可用'

问题描述:

我有一个应用程序,它连接到互联网并将数据存储在SQL数据库中。我使用iOS4进行测试,它完全可以正常工作。当我升级到新的版本,虽然,我得到一个NSInternalInconsistencyException,以此为原因:'没有数据库通道可用'

“_obtainOpenChannel - NSSQLCore 0x951a640:没有数据库信道可用”

从我可以收集,我的数据库正在被不应该被访问的东西,虽然我不明白在哪里或为什么。

任何人都可以帮助我找到并正确诊断我的问题吗?

+0

您是否最终发现问题?我现在也在使用它(昨天更新到iOs5 ...),而且根本没有任何信息可以找到。 – TheEye

我发现这一个东西:

我得到了错误(一些其他中,看似随机出现),而我是在不同的线程比管理方面是在创建一个访问管理对象的关系。在iOS5(请参阅http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-CoreData/_index.html#//apple_ref/doc/uid/TP40010637)中同时访问管理对象的过程中发生了一些更改 - 虽然文档声明默认行为应该与iOS5之前一样,但它显然不是真的,我的代码确实没有问题地工作在iOS4.2中。

现在,我的解决方法是完成主线程中的所有关系访问,将数据存储在数组中,并通过该数组访问我需要的数据。至少没有更多的错误。我认为这不是'好'的解决方案,因为我应该(也将会)改变我同时访问托管对象的方式,但是现在我不会立即改变它。

NSManagedObjectContext的此默认并发类型为NSConfinementConcurrencyType,这意味着它只能由单个线程使用。从文档:

您保证上下文不会被除您创建它之外的任何其他线程使用。

您可以改为创建一个由私人队列为多线程应用支持的管理对象上下文:

[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] 

从不同的线程使用管理对象方面,使用performBlock:(asyncronous)或performBlockAndWait: (同步),例如

__block NSArray *results; 
[[self managedObjectContext] performBlockAndWait:^{ 
    results = [[self managedObjectContext] executeFetchRequest:request error:&error]; 
}]; 
// do something with results 

该文档说,您不需要使用创建托管对象上下文的线程中的块API。

另一种选择是为每个线程创建单独的托管对象上下文。

查看iOS 5 release notes了解更多信息。