#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
. Большое вам спасибо! Что ж, теперь я это понял. Потрясающе 🙂