Удаление основных данных не удалось *легко исправить?*

У меня есть простая XCDataModel, которая содержит одну сущность с одним атрибутом. По сути, я сохраняю серию Dates.

Теперь я знаю, что добавляю NSDates правильно, потому что я запускаю запрос на выборку после их добавления и просматриваю результаты следующим образом:

for (NSManagedObject *info in fetchedObjects) {
    NSLog(@"Name: %@", [info valueForKey:@"attribute"]);
}

И каждый дополнительный NSDate учитывается. Пример из журнала:

2012-06-19 12:40:38.531 Arts Days[47194:16103] Name: 2013-03-27 04:00:00 +0000
2012-06-19 12:40:38.531 Arts Days[47194:16103] Name: 2013-03-01 05:00:00 +0000
2012-06-19 12:40:38.532 Arts Days[47194:16103] Name: 2013-01-01 05:00:00 +0000

Теперь, когда я пытаюсь удалить объект из Core Data, это оказывается безуспешным (путем выполнения той же выборки и повторного просмотра результатов).

Вот добыча:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

[fetchRequest setFetchBatchSize:366];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

NSError *error = nil;

[fetchRequest setSortDescriptors:sortDescriptors];

NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

for (NSManagedObject *object in fetchedObjects) {
    if ([[object valueForKey:@"date"] isEqualToDate:date]) {
        [managedObjectContext deleteObject:object];
    }
}
if (![managedObjectContext save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}

Кроме того, NSLog с неразрешенной ошибкой содержит ноль-ноль...

Вы знаете, что я делаю неправильно?


person achi    schedule 19.06.2012    source источник
comment
Если это весь ваш код, то вы никогда не выполняли выборку с вашим fetchRequest, а fetchObjects пусто (на самом деле, ноль).   -  person gschandler    schedule 19.06.2012
comment
Я эту строчку случайно пропустил   -  person achi    schedule 19.06.2012
comment
вы отладили код? это выполняется, как ожидалось?   -  person Dima    schedule 19.06.2012
comment
Он строится без ошибок или предупреждений. Он выполняется не так, как ожидалось, потому что объект просто не удаляется.   -  person achi    schedule 19.06.2012
comment
Хотя это не решит вашу проблему, я бы предложил использовать NSPredicate для захвата только записей с датой, которую вы хотите сопоставить, затем выполнить итерацию по этому списку результатов, чтобы выполнить удаление, и, наконец, выполнить сохранение after< /b> заканчивая телом цикла.   -  person gschandler    schedule 19.06.2012
comment
Я согласен с @gschandler, после всех удалений, вероятно, должно быть только одно сохранение.   -  person Chris Trahey    schedule 19.06.2012
comment
Как на самом деле выглядит ваша модель? Ваш первый фрагмент кода на самом деле не доказывает, что у вас есть правильная дата в записи, не говоря уже о какой-либо дате. Вы просто печатаете содержимое attribute (которое похоже на какое-то имя). Вы пытались зарегистрировать даты, которые у вас есть в каждой записи, чтобы подтвердить действительные данные?   -  person gschandler    schedule 19.06.2012
comment
Хорошо, я поместил код под петлей. Ошибка сохраняется..   -  person achi    schedule 19.06.2012
comment
Я написал атрибут как общее имя для сообщения. Я включу зарегистрированный текст выше.   -  person achi    schedule 19.06.2012
comment
Я заметил, что везде в коде вы используете self.managedObjectContext, кроме случаев, когда вы вызываете deleteObject и save:. Может быть, вы используете локальный экземпляр, который недействителен (ноль)?   -  person gschandler    schedule 19.06.2012
comment
@gschandler, вот и все. Не могли бы вы опубликовать это в разделе ответов. Спасибо! (я знал, что будет мало)   -  person achi    schedule 19.06.2012


Ответы (1)


Похоже, вы используете два разных экземпляра NSManageObjectContext. self.managedObjectContext (ivar), чтобы настроить запрос на выборку и выполнить выборку, но локальный экземпляр для выполнения операций deleteObject: и save:. Локальный экземпляр managedObjectContext, вероятно, равен нулю и не относится к тому же объекту, что и ivar.

person gschandler    schedule 19.06.2012