Ios CoreData:创建临时模型,并可能保存到上下文中

Ios CoreData:创建临时模型,并可能保存到上下文中,ios,core-data,nsmanagedobject,nsmanagedobjectcontext,temporary,Ios,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,Temporary,我对核心数据有问题,因为我不知道解决问题的最佳方法: 我从服务器加载json,并在ManagedObjects中解析结果。首先,ManagedObjects应该是临时的。 但是用户可以将ManagedObject放到传单上。然后ManagedObject应该保存到CoreData。(对象应该可以脱机访问) 当用户稍后从服务器加载相同的对象时,应获取已保存的ManagedObjects 所以我不想把用户不需要的所有对象都放在CoreData/PersistantStore中 首先,我要做的是创建一

我对核心数据有问题,因为我不知道解决问题的最佳方法:

我从服务器加载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;
通过获取,我检查persistantstore中是否已经有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中,我编写了一个函数,用于在主ManagedObject上下文中插入ManagedObject:

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

    [self saveContext];
}

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

您无法使用
nil
上下文创建对象,而是使用“temp”上下文。如果要保存它们,请调用
[tempContext save:nil]。如果你想丢弃它们,就扔掉上下文


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

My Mundi

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

  • 创建临时对象
NSEntityDescription*entity=[NSEntityDescription entityForName:@“MyEntity”inManagedObjectContext:myMOC];
NSManagedObject*unassociatedObject=[[NSManagedObject alloc]initWithEntity:entity InsertintoManagedObject上下文:nil];
  • 如果要永久保存,请编写此代码
[managedObjectContext插入对象:未关联的对象];
n错误*错误=nil;
如果(![managedObjectContext保存:&错误])
{
//回应错误
}