CoreData:创建临时模型并保存到上下文

mar*_*rco 2 core-data temporary nsmanagedobject nsmanagedobjectcontext ios

我有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;
Run Code Online (Sandbox Code Playgroud)

使用fetch,我检查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];
}
Run Code Online (Sandbox Code Playgroud)

我对每一段关系都这样做:

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

通过创建模型到目前为止工作正常.但如何保存一个模型?

managedObjectContext为nil.如果我在managedObjectContext上调用save:它会保存所有内容.

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

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

    [self saveContext];
}
Run Code Online (Sandbox Code Playgroud)

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

Mun*_*ndi 5

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

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


Bev*_*tel 5

优秀的回答我的Mundi ..

这里是关于创建NSManagedObject临时的更多场景,我们是否可以使它成为永久物如果我们想要的话.

  • 创建临时对象
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:myMOC];
NSManagedObject *unassociatedObject = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
Run Code Online (Sandbox Code Playgroud)
  • 如果要永久保存,请对此进行编码
[managedObjectContext insertObject:unassociatedObject];
NSError *error = nil;

if (![managedObjectContext save:&error]) 
{
  //Respond to the error
}
Run Code Online (Sandbox Code Playgroud)