Удаленные объекты Core Data, вновь появляющиеся при запуске

#iphone #core-data #object

#iPhone #core-data #объект

Вопрос:

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

У кого-нибудь есть идея, почему мои объекты Core Data удалены некорректно?

Здесь я удаляю объект:

 // Define our table/entity to use  
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Notes" inManagedObjectContext:managedObjectContext];

// Setup the fetch request  
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];

// Fetch the records and handle an error  
NSError *error;  
NSMutableArray *allNotes = [[NSMutableArray alloc] initWithArray:[[managedObjectContext executeFetchRequest:request error:amp;error] mutableCopy]];

for(int i = 0; i < [allNotes count]; i  ) {
    if([[allNotes objectAtIndex:i] identifier] == [[note objectAtIndex:0] identifier]) {
        [managedObjectContext deleteObject:[allNotes objectAtIndex:i]];
        NSLog(@"DELETING..");
        NSLog(@"%@", [allNotes objectAtIndex:i]);
    }
}

[request release];
  

Вот как я настраиваю массив записей Core Data при запуске

 // Define our table/entity to use  
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Notes" inManagedObjectContext:managedObjectContext_];

    // Setup the fetch request  
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];

    // Fetch the records and handle an error  
    NSError *error;  
    globalNotes = [[NSMutableArray alloc] initWithArray:[[managedObjectContext_ executeFetchRequest:request error:amp;error] mutableCopy]];

    [request release];

    NSLog(@"NOTES ON STARTUP");
    NSLog(@"%@", globalNotes);
  

Вот некоторые данные, которые я использую для печати NSLog . Это может помочь решить проблему и покажет, что эти заметки удалены, но появляются снова.

 2011-04-25 20:11:40.877 Caltio[4039:707] NOTES ON STARTUP
2011-04-25 20:11:40.888 Caltio[4039:707] (
    "<Notes: 0x1855d0> (entity: Notes; id: 0x184cd0 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p2> ; data: <fault>)",
    "<Notes: 0x1858b0> (entity: Notes; id: 0x184ce0 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p3> ; data: <fault>)"
)
2011-04-25 20:16:41.561 Caltio[4039:707] DELETING..
2011-04-25 20:16:41.569 Caltio[4039:707] <Notes: 0x1855d0> (entity: Notes; id: 0x184cd0 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p2> ; data: {
    added = "2011-04-25 17:56:15  0000";
    identifier = 2567446185;
    note = Test;
    updated = 0;
})
2011-04-25 20:16:41.589 Caltio[4039:707] NOTES AFTER REFRESH:
2011-04-25 20:16:41.595 Caltio[4039:707] (
    "<Notes: 0x1858b0> (entity: Notes; id: 0x184ce0 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p3> ; data: {n    added = "2011-04-25 17:57:26  0000";n    identifier = 2567446127;n    note = Test;n    updated = 0;n})"
)

2011-04-25 20:17:05.103 Caltio[4052:707] NOTES ON STARTUP
2011-04-25 20:17:05.115 Caltio[4052:707] (
    "<Notes: 0x1bee60> (entity: Notes; id: 0x1be570 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p2> ; data: <fault>)",
    "<Notes: 0x1bf150> (entity: Notes; id: 0x1bdcd0 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p3> ; data: <fault>)"
)
  

Ответ №1:

Сохраняете ли вы свои managedObjectContext ? Насколько я понимаю, добавление, изменение и удаление объектов действительно влияет только на их представление в памяти. Вам также необходимо сохранить контекст, чтобы сохранить его.

Комментарии:

1. В моем AppDelegate есть метод, который называется - (void)saveContext Это добавляется при создании проекта. Я думаю, managedObjectContext это сохраняется здесь. Я ничего не делаю, кроме этого. Есть ли другой способ, которым я могу это сохранить?

2. NSManagedObjectContext имеет метод, вызываемый save: . Версия saveContext в делегате приложения, предполагающая, что та, на которую вы ссылаетесь, является той, что указана в шаблонах, сохраняется только при завершении работы приложения. Конечно, в iOS4 такого почти никогда не бывает.

3. Это здорово! Я думал, что это было сохранено с помощью saveContext . Большое вам спасибо! Что ж, теперь я это понял. Потрясающе 🙂