CoreData: создание временных моделей и, возможно, сохранение в контексте

У меня проблема с Core Data, потому что я не знаю лучшего способа справиться с этой проблемой:

Я загружаю json с сервера и анализирую результаты в ManagedObjects. Сначала ManagedObjects должен быть временным. Но пользователь может поместить ManagedObject в листовку. Затем ManagedObject должен быть сохранен в CoreData. (Объект должен быть доступен в автономном режиме) Когда пользователь загружает те же объекты через некоторое время с сервера, должны быть извлечены уже сохраненные объекты ManagedObject.

Поэтому я не хочу помещать каждый объект в CoreData / PersistantStore, который не нужен пользователю.

Сначала я создаю фоновый контекст:

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

С извлечением я проверяю, существует ли уже ManagedObject в постоянном хранилище. Если есть, я возьму это. иначе создайте новый 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 равен нулю. Если я вызываю save: на managedObjectContext, он сохраняет все.

В моем AppDelegate я написал функцию для вставки ManagedObject в основной ManagedObjectContext:

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

    [self saveContext];
}

Это хорошее решение? или есть лучший способ сохранить временные ManagedObjects в главном ManagedObjectContext?

2 ответа

Решение

Вы не можете создавать объекты с nil контекст, но с временным контекстом. Если вы хотите сохранить их, позвоните [tempContext save:nil];, Если вы хотите отказаться от них, просто отбросьте контекст.

Другая стратегия состоит в том, чтобы вообще избежать сложности нескольких контекстов, добавив простой логический атрибут temp для вашей сущности (если отношения один-ко-многим, только сущность верхнего уровня должна иметь это). Вы можете сохранить по умолчанию и отображать только не временные элементы. Вы можете удалять временные элементы, включая все связанные элементы, немедленно или периодически.

Отлично ответил мой 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
}
Другие вопросы по тегам