如果应用程序第二次运行,则从executeFetchRequest返回的记录为空

时间:2016-06-13 11:36:33

标签: ios objective-c core-data

我在使用核心数据时遇到了奇怪的数据丢失。

我使用以下代码将记录保存到核心数据。

    for (int i = 0; i < [domains count]; i++){

        NSString *is_active = [[domains objectAtIndex:i] objectForKey:@"is_active"];
        NSString *domain_id = [[domains objectAtIndex:i] objectForKey:@"domain_id"];
        NSString *domain_name = [[domains objectAtIndex:i] objectForKey:@"domain_name"];

        [context performBlockAndWait:^{
            NSManagedObject *domain = [NSEntityDescription insertNewObjectForEntityForName:@"Domains" inManagedObjectContext:context];
            [domain setValue:is_active forKey:@"isActive"];
            [domain setValue:domain_id forKey:@"domainId"];
            [domain setValue:domain_name forKey:@"domainName"];
        }];
    }

我使用以下代码来获取记录。

NSError *error;
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Domains"];

    self.domainContext = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

    NSLog(@"domain context %@",self.domainContext);

我正在使用真实设备进行测试。

如果我是第一次在我的设备中运行应用程序,self.domainContext中有一些内容。如果我第二次运行应用程序而不手动关闭应用程序,self.domainContext没有任何内容。但是,如果我手动关闭应用程序并重新运行应用程序,则self.domainContext已保存内容。为什么会这样?仅当我手动关闭我的应用程序时,数据才会持久保存到磁盘。如果我从xcode运行应用程序而不手动关闭我的应用程序,则数据不会保留。

1 个答案:

答案 0 :(得分:1)

您尚未保存上下文。因此您第二次丢失了数据。像这样改变你的代码

for (int i = 0; i < [domains count]; i++){

    NSString *is_active = [[domains objectAtIndex:i] objectForKey:@"is_active"];
    NSString *domain_id = [[domains objectAtIndex:i] objectForKey:@"domain_id"];
    NSString *domain_name = [[domains objectAtIndex:i] objectForKey:@"domain_name"];

    [context performBlockAndWait:^{
        NSManagedObject *domain = [NSEntityDescription insertNewObjectForEntityForName:@"Domains" inManagedObjectContext:context];
        [domain setValue:is_active forKey:@"isActive"];
        [domain setValue:domain_id forKey:@"domainId"];
        [domain setValue:domain_name forKey:@"domainName"];
    }];
    NSError *error = nil;
    [context save:&error];
}

希望这会对你有所帮助。