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

标签 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 运行应用程序而不手动关闭应用程序,则数据不会被保留。

最佳答案

你没有保存上下文,所以你第二次丢失了数据。像这样更改您的代码

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];
}

希望对您有所帮助。

关于ios - 如果应用程序第二次运行,从 executeFetchRequest 返回的记录为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37788829/

相关文章:

ios - 支持的方向与应用程序没有共同的方向,并且 [RCTModalHostViewController shouldAutorotate] 返回 YES

ios - Artifactory Cocoapods 包括/白名单

ios - 在 iOS 中实例化一个后台运行循环

ios - 解释 glReadPixels()

ios - 从核心数据列表中删除 NSEntityDescription 对象

ios - 发送到其他设备后 NSData 丢失

objective-c - FoundationTool 中的 Runloop

objective-c - 从 Objective-C 协议(protocol)实例匹配 Swift 协议(protocol)

ios - 根据实体之间的关系类型创建 NSFetchedResultsController 部分

iphone - 使用 NSPredicate 获取核心数据对象的问题