未获取的提取请求

时间:2011-07-06 14:14:09

标签: objective-c core-data

我正在开发一个核心数据项目,它将与我的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>

2 个答案:

答案 0 :(得分:0)

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

对于第二个托管对象上下文选项,executeFetchRequest:error:只应在发生错误时返回nil。你传递了一个错误参数,所以你应该首先考虑确定错误。

获取请求显然不是错误的,但是您的问题表明您的托管对象上下文有所破坏。

答案 1 :(得分:0)

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

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

如果之前有效,那么您可能根本没有添加或删除了在Xcode中本地应用程序的构建目标中定义.xcdatamodel实体的Song文件。