这个 NSFetchRequest 有啥问题?
Posted
技术标签:
【中文标题】这个 NSFetchRequest 有啥问题?【英文标题】:What's wrong in this NSFetchRequest?这个 NSFetchRequest 有什么问题? 【发布时间】:2013-01-14 09:35:31 【问题描述】:简单的问题。谁能告诉我这段代码有什么问题?
+ (NSManagedObject*) managedObjectWithServerId:(NSInteger)serverId inManagedObjectContext:(NSManagedObjectContext*)context
//Execute request and get all the results
NSError * error = nil;
NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass(self)];
request.predicate = [NSPredicate predicateWithFormat:@"serverId == %@" argumentArray:[NSArray arrayWithObject:[NSNumber numberWithInteger:serverId]]];
NSArray * results = [context executeFetchRequest:request error:&error];
结果数组总是一个有 0 个对象的 NSArray,没有给出错误,什么也没有。只是一个 0 计数数组。
并且不可能总是返回 0 个元素,我正在使用 SQLite 资源管理器探索 Core Data 数据库,并且我正在请求带有 serverId
的元素,所以应该至少有 1 个。
我做的谓词错了吗?
以上代码在NSManagedObject
类中实现,调用方式如下:
[User managedObjectWithServerId:whatev inManagedObjectContext:context];
User
是我的模型中的一个实体,也是NSManagedObject
的子类。
【问题讨论】:
我对你的代码的两个部分有点好奇。 1) 这个方法是在哪个类中实现的,它的名称是否与模型中的实体匹配? 2)尝试一个更简单的谓词,例如[NSPredicate predicateWithFormat:@"serverId = %@",@(serverId)]
,请注意单个等号。看看有没有什么作用。可能只是迷信,但谁知道呢。
1) 它在 NSManagedObject 的类别中实现。我的模型中的所有对象都需要具有服务器中对象的 id (serverId)。而且我需要通过此 serverId 获取对象 2) 尝试了您的代码,但没有运气,我仍然得到 0 个结果:\ 也许这个额外的信息可以提供帮助。有时我的应用程序会因核心数据自动保存而崩溃(而不是在我手动执行保存时,效果很好)***由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“此 NSPersistentStoreCoordinator 没有持久存储。它无法执行保存操作。'
现在,当您实际调用该方法时,您会像 [AnEntityClass managedObjectWithServerId:inManagedObjectContext:]
那样执行它,而不是直接调用 NSManagedObject
对吗?只是检查。没有持久存储听起来很糟糕......
是的,当然。例如,从 User 类中,我得到类似 [User managedObjectWithServerId:whatev inManagedObjectContext:context];我检查了获取请求对象并且类是正确的。如果它不正确,我会得到一个错误,而不是 0 结果。也许与上下文有关?
您可以将“-com.apple.CoreData.SQLDebug 3”添加到目标的启动参数中,然后所有 SQLite 查询都会显示在调试器窗口中。然后您可以将其与您的 SQLite 资源管理器进行比较。
【参考方案1】:
问题已解决,由于意外情况,我似乎总是在重新创建数据库文件。我注意到,因为所有主键总是从 1 开始。
如果您在创建新的 UIManagedDocument 数据库文件之前不删除以前的 UIManagedDocument 数据库文件,CoreData 似乎会出现一些问题。
条件修复后,我没有收到 NSPersistentStoreCoordinator 崩溃错误,我可以看到所有带有调试的 SQL 方法,而且我的提取当然可以正常工作。
感谢所有尝试提供帮助的人,很抱歉浪费您的时间:)
【讨论】:
以上是关于这个 NSFetchRequest 有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章
将 NSPredicate 设置为 NSFetchRequest 后 executeFetchRequest 崩溃
NSFetchedResultsController 在 NSFetchRequest 中带有 NSDictionaryResultsType