CoreData insertNewObjectForEntityForName和executeFetchRequest返回nil

时间:2014-02-12 11:55:12

标签: ios objective-c core-data

我会尝试揭露我的问题,因为有点复杂。 我使用核心数据,我对存储的数据有疑问。 当我使用这段代码时:

NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"ItemMessage"];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];
NSMutableArray *values = [[NSMutableArray alloc] init];

if (error == nil) {
    for (int i = 0; i<results.count; i++) {
        NSLog(@"results %@",[results objectAtIndex:i]);
        ItemMessage *itemMessage = [results objectAtIndex:i];
        [values addObject:itemMessage];
    }

ECC。问题是NSLog打印的值是正确的(“结果”包含一些东西)但是itemMessage总是包含0个键/值对(它似乎是空的)。 要了解问题是什么,我回过头来看到insertNewObjectForEntityForName我也遇到了这个问题,这是我在核心数据中保存邮件数据时使用的代码:

for (id key in objectMessage) {
    ItemMessage *itemmessage = [[ItemMessage alloc] init];
    itemmessage.itemMessageId = [key objectForKey:@"itemMessageId"];
    itemmessage.message = [key objectForKey:@"message"];
    itemmessage.sender = [key objectForKey:@"sender"];
    itemmessage.users = [key objectForKey:@"users"];

    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    NSManagedObject *newMessage;
    newMessage = [NSEntityDescription insertNewObjectForEntityForName:@"ItemMessage" inManagedObjectContext:context];
    [newMessage setValue: itemmessage.itemMessageId forKey:@"itemMessageId"];
    [newMessage setValue: itemmessage.message forKey:@"message"];
    [newMessage setValue: itemmessage.sender forKey:@"sender"];
    [newMessage setValue: itemmessage.users forKey:@"users"];
    [context save:&error];
    if (error != nil) {
        NSLog(@"Coredata error");
    }

问题是newMessage之后的insertNewObjectForEntityForNamesetValue还包含0个键/值对。 你能救我吗?

2 个答案:

答案 0 :(得分:4)

您似乎没有将新的托管对象正确插入上下文中 它应该是:

for (id key in objectMessage) {
    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    ItemMessage *itemmessage = (ItemMessage*)[NSEntityDescription insertNewObjectForEntityForName:@"ItemMessage" 
                                                                           inManagedObjectContext:context];
    itemmessage.itemMessageId = [key objectForKey:@"itemMessageId"];
    itemmessage.message = [key objectForKey:@"message"];
    itemmessage.sender = [key objectForKey:@"sender"];
    itemmessage.users = [key objectForKey:@"users"];
}
//save your inserts

要为您的托管对象创建一个类文件,您可以:

转到您的模型文件(xcdatamodeld) - &gt;
选择一个实体 - &gt;
从菜单中选择:
编辑器 - &GT;创建NSManagedObjectSubclass - &gt;选择您喜欢的类文件的实体。

现在,您将拥有可以轻松访问的托管对象(NSManagedObject子类),并从CoreData功能中受益。

答案 1 :(得分:2)

当你插入管理对象竞赛时,你必须调用save:方法,保存方法也应该是这样的:

newMessage = [NSEntityDescription insertNewObjectForEntityForName:@"ItemMessage" inManagedObjectContext:context];
//  2
  newMessage.property1 = self.firstNameTextfield.text;
  newMessage.property2 = self.lastNameTextfield.text;

if (![context save:&error]) {
    NSLog(@"Error: %@", [error localizedDescription]);
  }