【问题标题】: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 资源管理器进行比较。

标签: ios ios5 core-data


【解决方案1】:

问题已解决,由于意外情况,我似乎总是在重新创建数据库文件。我注意到,因为所有主键总是从 1 开始。

如果您在创建新的 UIManagedDocument 数据库文件之前不删除以前的 UIManagedDocument 数据库文件,CoreData 似乎会出现一些问题。

条件修复后,我没有收到 NSPersistentStoreCoordinator 崩溃错误,我可以看到所有带有调试的 SQL 方法,而且我的提取当然可以正常工作。

感谢所有尝试提供帮助的人,很抱歉浪费您的时间:)

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 2021-08-20
    • 2015-09-23
    • 2021-02-27
    • 2012-03-10
    • 2010-11-01
    • 2011-08-26
    • 2020-04-16
    • 1970-01-01
    相关资源
    最近更新 更多