这个 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 有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

python的“re.compile”有啥作用?

path() 和 re_path() 有啥区别?

将 NSPredicate 设置为 NSFetchRequest 后 executeFetchRequest 崩溃

NSFetchedResultsController 在 NSFetchRequest 中带有 NSDictionaryResultsType

NSFetchRequest 不适用于谓词

NSFetchRequest 不返回任何东西