我的核心数据有问题,因为我不知道处理问题的最佳方法:
我从服务器加载 json 并解析 ManagedObjects 中的结果。首先,托管对象应该是临时的。 但用户可以将 ManagedObject 放入传单中。然后将 ManagedObject 保存到 CoreData 中。 (该对象应该可以离线访问) 当用户稍后从服务器加载相同的对象时,应该获取已经保存的 ManagedObjects。
所以我不想将用户不需要的每个对象都放入 CoreData / PersistantStore 中。
首先我要做的是创建一个背景上下文:
__block NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSManagedObjectContext *backgroundContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
backgroundContext.parentContext = context;
通过获取,我检查持久存储中是否已有 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];
}
这是一个好的解决方案吗?或者有更好的方法在主 ManagedObjectContext 中保存临时 ManagedObjects 吗?
我的 Mundi 的回答非常好..
这里有更多创建
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
}
您无法使用
nil
上下文创建对象,而是使用“临时”上下文创建对象。如果您想保存它们,请致电[tempContext save:nil];
。如果你想丢弃它们,只需丢弃上下文即可。
另一种策略是通过向实体添加一个简单的布尔属性
temp
来完全避免多个上下文的复杂性(如果关系是一对多,则只有顶级实体需要具有此属性)。您可以默认保存并仅显示非临时项目。您可以立即或定期删除临时项目,包括所有相关项目。