Как я могу использовать Базовые Объекты Данных вне контекста управляемого объекта? - PullRequest
2 голосов
/ 23 августа 2009

Я хотел бы использовать Базовые управляемые объекты данных вне контекста управляемого объекта. Я видел другие темы на этом сайте, которые говорят, что вы никогда не должны этого делать, но вот моя проблема:

У меня есть объект «Канал» и объект «История». Канал похож на канал RSS, а история похожа на отдельную историю из этого канала. У меня есть возможность создавать закладки для каналов, и я использую Core Data для их сохранения, но я, когда я загружаю истории из ленты, я не хочу вставлять эти истории в контекст управляемого объекта. Однако единственный способ создать мои объекты - это сделать:

[NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:managedObjectContext];

Это означает, что оно будет сохранено при следующем событии сохранения.

Я не хочу, чтобы эти объекты сохранялись до тех пор, пока пользователь их не выберет.

Я попытался определить «TransientStory» и «PersistentStory» с протоколом «Story», который они оба реализуют, но это кошмар. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 13 ноября 2012

Вы можете создавать эти объекты и просто не вставлять их в контекст:

NSEntityDescription *entity = [NSEntityDescription entityForName:entityName
                                          inManagedObjectContext:managedContext];
ManagedObjectClass *volatileObject = [[ManagedObjectClass alloc] initWithEntity:entity
                                                 insertIntoManagedObjectContext:nil];

И если вы хотите сохранить его, просто вставьте его в контекст:

[managedContext insertObject:volatileObject];

(если вы забудете добавить его, при попытке сохранить его в контексте возникнет ошибка висящего объекта)

1 голос
/ 09 февраля 2011

Создайте новый NSManagedObjectContext с хранилищем в памяти. Затем вы можете поместить свои временные объекты в этот контекст, и они не будут сохранены.

NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]]]; // though you can create a model on the fly (i.e. in code)
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc]     initWithManagedObjectModel:mom];

NSError *err;

// add an in-memory store. At least one persistent store is required
if([psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&err] == nil) {
  NSLog(@"%@",err);
}

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
[moc setPersistentStoreCoordinator:psc];

Если вы хотите сохранить их, просто переместите их в нужное хранилище или объедините контекст.

В качестве альтернативы, если вы в конечном итоге все равно собираетесь поместить их в этот контекст (т.е. вы просто не хотите, чтобы они появлялись в списках до тех пор, пока они не будут сохранены), тогда просто установите setIncludesPendingChanges в NO в вашем NSFetchRequest.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...