Неверная ошибка iphone Core при сохранении



Answers

Некоторое время я боролся с этим. Реальная проблема здесь в том, что отладка, которую у вас есть, не показывает вам, в чем проблема. Причина этого заключается в том, что CoreData поместит массив объектов NSError в объект NSError верхнего уровня, который будет возвращен, если будет более одной проблемы (Вот почему вы видите ошибку 1560, которая указывает на множество проблем и массив ошибок 1570). Похоже, что CoreData имеет несколько ключей, которые он использует, чтобы хранить информацию в ошибке, которую она возвращает, если есть проблема, которая даст вам более полезную информацию (например, сущность, на которой произошла ошибка, связанный с ней атрибут / атрибут и т. Д. ). Ключи, которые вы используете для проверки словаря userInfo, можно найти здесь, в справочных документах .

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

    NSError* error;
    if(![[survey managedObjectContext] save:&error]) {
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0) {
            for(NSError* detailedError in detailedErrors) {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
            }
        }
        else {
            NSLog(@"  %@", [error userInfo]);
        }
    }

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

Question

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

сообщение об ошибке:

Unresolved error Domain=NSCocoaErrorDomain Code=1560 UserInfo=0x14f5480 "Operation could not be completed. (Cocoa error 1560.)", {
NSDetailedErrors = (
Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x5406d70 "Operation could not be completed. (Cocoa error 1570.)",
Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x14f9be0 "Operation could not be completed. (Cocoa error 1570.)"
);
}

и метод, который генерирует ошибку:

- (IBAction)saveAction:(id)sender {
    NSError *error;
    if (![[self managedObjectContext] save:&error]) {
        // Handle error
        NSLog(@"Unresolved error %@, %@, %@", error, [error userInfo],[error localizedDescription]);
        exit(-1);  // Fail
    }
}

любая идея по причине этого сообщения? что он появляется случайным образом




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

po [myObject validateForInsert]

Более подробная информация о проблеме приведена в описании ошибки. Успешная проверка означает, что вы не получите выход.




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

Итак, схема такова:

"Parent" with relationship "child" One to One
Create Child 1, set parent. Save - OK
Create Child 2, set parent. Save - Error, Child 1.Parent == nil
(behind the scene child 2 did nullify child 1 parent)

Изменение отношений в родительском от одного до одного к многому одному решало эту задачу.




Related