【问题标题】:CoreData: Create temporary models and maybe save to contextCoreData:创建临时模型并可能保存到上下文
【发布时间】:2014-08-04 10:08:01
【问题描述】:

我对 Core Data 有疑问,因为我不知道解决问题的最佳方法:

我从服务器加载 json 并在 ManagedObjects 中解析结果。起初,ManagedObjects 应该是临时的。 但是用户可以将 ManagedObject 放到传单中。然后将 ManagedObject 保存到 CoreData。 (对象应该可以离线访问) 当用户稍后从服务器加载相同的对象时,应该获取已保存的 ManagedObjects。

所以我不想将用户不需要的每个对象都放在 CoreData / PersistantStore 中。

首先我要做的是创建一个背景上下文:

__block NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSManagedObjectContext *backgroundContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
backgroundContext.parentContext = context;

通过 fetch 我检查持久存储中是否已经存在 ManagedObject。 有的话我就拿这个。否则在 nil 上下文中创建一个新的 ManagedObject。

NSArray *results = [backgroundContext executeFetchRequest:fetch error:&error];

if (!error && results.count == 1) {
    myModel = [results objectAtIndex:0];
}
else {
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyModel" inManagedObjectContext:backgroundContext];
    myModel = (MyModel *)[[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
}

我对每段关系都这样做:

if (! myModel.relation) {
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Relation" inManagedObjectContext:backgroundContext];
    myModel.relation = (Relation *)[[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:myModel.managedObjectContext];
}

到目前为止,在创建模型方面工作正常。 但是如何保存一个模型呢?

managedObjectContext 为零。如果我在 managedObjectContext 上调用 save:,它会保存所有内容。

在我的 AppDelegate 中,我编写了一个函数来在主 ManagedObjectContext 中插入一个 ManagedObject:

- (void)insertObjectAndSave:(NSManagedObject *)managedObject {
    if (!managedObject.managedObjectContext) {
        [self.managedObjectContext insertObject:managedObject];
    }

    [self saveContext];
}

这是一个好的解决方案吗?还是有更好的方法将临时 ManagedObjects 保存在主 ManagedObjectContext 中?

【问题讨论】:

    标签: ios core-data nsmanagedobject nsmanagedobjectcontext temporary


    【解决方案1】:

    优秀的回答我的世界..

    这里有更多创建 NSManagedObject 临时的场景,如果我们愿意,我们是否可以将其设为永久。

    • 创建临时对象
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:myMOC];
    NSManagedObject *unassociatedObject = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
    
    • 如果您想永久保存,请编码
    [managedObjectContext insertObject:unassociatedObject];
    NSError *error = nil;
    
    if (![managedObjectContext save:&error]) 
    {
      //Respond to the error
    }
    

    【讨论】:

      【解决方案2】:

      您无法使用nil 上下文创建对象,而是使用“临时”上下文。如果您想保存它们,请致电[tempContext save:nil];。如果您想丢弃它们,只需丢弃上下文。

      另一种策略是通过向您的实体添加一个简单的布尔属性temp 来完全避免多个上下文的复杂性(如果关系是一对多的,则只有顶级实体需要这个)。您可以默认保存并仅显示非临时项目。您可以立即或定期删除临时项目,包括所有相关项目。

      【讨论】:

        猜你喜欢
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多