1

Хорошо, давайте начнем с кода. Я перебираю возвращаемый массив словарей и создаю (или обновляю) объекты на их основе. В этом методе я пытаюсь найти или создать новый объект. И если объект должен быть удален, я бы хотел сделать это и не тратить время на обновление новой информации.Как удалить новые объекты из NSManagedObjectContext

- (void)updateOrCreateObjectWith:(NSDictionary*)dictionary { 
    RKManagedObjectStore *objectStore = ((MyAppDelegate*)[[UIApplication sharedApplication] delegate]).objectStore; 

    id updateObject = (NSManagedObject*)[objectStore findOrCreateInstanceOfEntity:[resource entity] withPrimaryKeyAttribute:@"myID" andValue:[dictionary objectForKey:@"id"]]; 

    [updateObject setMyID:[dictionary objectForKey:@"id"]]; 

    // if marked for deletion, delete it now 
    if ([[dictionary objectForKey:@"deleted_at"] isKindOfClass:[NSString class]]) { 
     if ([updateObject isNew]){ 
      NSError *error = nil; 
      [objectStore.managedObjectContext save:&error]; 
      if (error) { 
       NSLog(@"error saving before delete: %@",error); 
       return; 
      } 
//   [objectStore.managedObjectContext deleteObject:updateObject]; 
//   [objectStore.managedObjectCache delete:updateObject]; 
     } 
     else { 
      [objectStore.managedObjectContext deleteObject:updateObject];    
     } 
     return; 
    } 

    [updateObject updateWith:dictionary]; 
} 

Часть, чтобы быть в курсе, секция deleted_at с секцией (1) сохранить, (2) удалить объект из контекста, и (3) удалить объект из кэша. Я пробовал несколько комбинаций из этих трех, но я не получаю желаемых результатов.

Если удалить из кэша (только # 3):

  • Объектов спасутся, но они не имеют атрибутов.

Если я удалить его из управляемого контекста (только # 2) я получаю:

NSUnderlyingException=Cannot update object that was never inserted. 

Поскольку он никогда не был включен, я думал, что сохранить его, а затем удалить его (# 1 и # 2), но затем я получаю:

*** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0xed27810 <x-coredata://4EE6AD5A-CC34-460A-A97A-0909454126A4/User/p166>'' 

Так что правильный способ, чтобы удалить «новый» объект из NSMangedObjectContext?

ответ

2

легче получить экземпляр RKManagedObjectStore с [[RKObjectManager sharedManager] objectStore] (если вы хотите общий один, который кажется, что вы делаете, так как вы вызываете ваше приложение делегата).

Проверьте перед ключом deleted_at перед созданием объекта NSManagedObject. Этот код предполагает, что вы конвертируете в тип Resource, который является подклассом NSManagedObject. Он непроверен, но должен дать вам представление о том, что вы должны делать.

- (void)updateOrCreateObjectWith:(NSDictionary*)dictionary { 
RKManagedObjectStore *objectStore = [[RKObjectManager sharedManager] objectStore]; 

    //get a reference to the object 
    Resource *resource = [Resource findFirstByAttribute:@"myID" withValue:[dictionary objectForKey:@"id"]]; 

    //see if "deleted_at" exists in dictionary 
    if ([[dictionary objectForKey:@"deleted_at"] isKindOfClass:[NSString class]]) 
    { 
     //check to see if object exists in the context 
     if(resource) 
     { 
      //if it exists, delete it 
      [objectStore.managedObjectContext deleteObject:resource]; 
     } 
    } else { 
     //no "deleted at", so create the object 
     if (!resource) { 
      //resource is nil (it doesn't exist in the context), so we need to create it 
      resource = [Resource object]; 
     } 
     [resource updateWith:dictionary]; 
    } 

    NSError *error = nil; 
    [objectStore.managedObjectContext save:&error]; 
    if (error) { 
     NSLog(@"error saving before delete: %@",error); 
    } 
} 
+0

Благодарим за ответ. Наверное, я пытался поместить квадратный колышек в круглое отверстие. Я использую единственный RKManagedObjectStore, потому что у меня возникли проблемы, когда я пытаюсь построить отношения с моими объектами после загрузки. Я просто не знаю, что я знаю. Любые предложения для этого? – RyanJM

+0

Общий RKManagedObjectStore, вероятно, такой же, как объект objectStore делегата, если вы не установили свойство objectStore в sharedManager. Что касается вашего другого вопроса, трудно ответить, не видя какого-либо кода; вам следует рассмотреть вопрос о публикации другого вопроса или запроса в группе google или в канале irc. –

1

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

NSManagedObject *existingObject = ...; // fetch the object 
if (existingObject) { 
    if (deleted) { 
     [self.managedObjectContext deleteObject: existingObject]; 
    } 
} else { 
    if (!deleted) { 
     // create the object, insert it into the MOC, set the object properties 
    } 
} 
Смежные вопросы