【问题标题】:A fetch request that's not fetching未获取的获取请求
【发布时间】:2011-07-06 14:14:08
【问题描述】:

我正在开发一个核心数据项目,该项目将与我的 Ipad 通信并来回发送核心数据。我已经大致弄清楚了网络部分,但是我在获取简单的获取请求时遇到了问题。这是获取请求:

NSManagedObjectContext *context=[[[NSDocumentController sharedDocumentController] currentDocument] managedObjectContext];
//NSManagedObjectContext *context=[self managedObjectContext];
if (context == nil){
    NSLog(@"Crap");
}
NSLog(@"Context:  %@",context);
//fetch request:  (found here:  http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/iPhoneCoreData01/Articles/05_Fetching.html)
NSLog(@"Starting to fetch:");

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Song" inManagedObjectContext:context];
[request setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"cueNo" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSError *error;
NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy];

如果我使用这个:

NSManagedObjectContext *context=[[[NSDocumentController sharedDocumentController] currentDocument] managedObjectContext];

然后我收到一条错误消息:

+entityForName: 找不到实体名称“Song”的 NSManagedObjectModel

如果我使用这个:

NSManagedObjectContext *context=[self managedObjectContext];

即使我在实体 Song 中有数据,mutableFetchResults 也会返回 null。

我使用第一种方法直接从以前的版本复制了这个获取请求来设置上下文,它在那里工作得很好。

任何帮助将不胜感激!

疑难解答:

Printing description of persistentStoreCoordinator:

    Printing description of _managedObjectModel:
(<NSManagedObjectModel: 0x1001c5250>) isEditable 0, entities {
    Song = "(<NSEntityDescription: 0x100149ba0>) name Song, managedObjectClassName NSManagedObject, renamingIdentifier Song, isAbstract 0, superentity name (null), properties {\n    cueName = \"(<NSAttributeDescription: 0x1001c5600>), name cueName, isOptional 1, isTransient 0, entity Song, renamingIdentifier cueName, validation predicates (\\n), warnings (\\n), versionHashModifier (null), attributeType 700 , attributeValueClassName NSString, defaultValue (null)\";\n    cueNo = \"(<NSAttributeDescription: 0x1001c5570>), name cueNo, isOptional 1, isTransient 0, entity Song, renamingIdentifier cueNo, validation predicates (\\n), warnings (\\n), versionHashModifier (null), attributeType 700 , attributeValueClassName NSString, defaultValue (null)\";\n}, subentities {\n}, userInfo {\n}, versionHashModifier (null)";
}, fetch request templates {
    newFetchRequest = "<NSFetchRequest: 0x1001c5420> (entity: Song; predicate: (cueNo < \"0\"); sortDescriptors: (null); limit: 0)";
}

Printing description of _managedObjectContext:
<NSManagedObjectContext: 0x1001c5890>

【问题讨论】:

    标签: objective-c core-data


    【解决方案1】:

    错误消息非常清楚,它告诉您 NSEntityDescription 在您提供的托管对象上下文中找不到任何具有该名称的实体。由于您似乎正在验证上下文不是 nil(一个好的第一步),您接下来需要考虑核心数据堆栈的其余部分。托管对象上下文是否具有持久存储协调器?确保。持久存储协调器是否具有托管对象模型?该模型实际上是否包含 Song 实体?沿线某处有些地方坏了,但上面没有足够的细节来猜测哪里。

    至于第二个托管对象上下文选项,executeFetchRequest:error: 应该只在发生错误时返回 nil。您传入了一个错误参数,所以这是您应该首先查看以确定问题所在。

    获取请求并没有明显错误,但您的问题表明您的托管对象上下文以某种方式损坏。

    【讨论】:

    • 非常感谢!我做了检查,但我没有协调员或 MOM。我现在这样做,模型包含歌曲实体。我不确定如何将上下文与模型联系起来。任何帮助将不胜感激。
    • 我今天做了更多的故障排除。我终于厌倦了以编程方式从我的获取和添加数据中没有得到任何结果。我终于得到了我需要的结果,但揭示了 IB 连接不正确的问题。知道我可以做些什么来追踪这个问题吗?
    • 我逐步完成了获取并打印了变量“错误”的描述我得到了这个:打印错误描述:NSDocument 如果我理解正确,只有当这个变量是 nil 正确时才会有问题?
    • 我在疑难解答下添加的信息有帮助吗?
    【解决方案2】:

    错误告诉您托管对象上下文没有包含实体Song 的托管对象模型。托管对象模型是.xcdatamodel 文件。

    如果您想在另一台设备上打开持久性存储,您的本地应用程序必须有权访问创建远程持久性存储的同一模型文件,并且必须将模型添加到本地上下文。您收到的错误表明这没有发生。

    如果这以前可以正常工作,那么您可能根本没有从 Xcode 中本地应用的构建目标中添加或删除定义 Song 实体的 .xcdatamodel 文件。

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 2017-10-26
      • 2020-02-21
      • 2018-01-09
      • 1970-01-01
      • 2019-02-08
      • 2018-04-06
      • 1970-01-01
      • 2014-09-17
      相关资源
      最近更新 更多