Otrzymuję dziwny komunikat o błędzie z podstawowych danych podczas próby zapisania, ale problem polega na tym, że błąd nie jest odtwarzalny (pojawia się w różnym czasie podczas wykonywania różnych zadań)
komunikat o błędzie:
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.)"
);
}
a metoda generująca błąd to:
- (IBAction)saveAction:(id)sender {
NSError *error;
if (![[self managedObjectContext] save:&error]) {
// Handle error
NSLog(@"Unresolved error %@, %@, %@", error, [error userInfo],[error localizedDescription]);
exit(-1); // Fail
}
}
jakiś pomysł na powód tej wiadomości? dając, że pojawia się losowo
iphone
objective-c
ios
core-data
Ahmed Kotb
źródło
źródło
Odpowiedzi:
Oznacza to, że przypisano zerową właściwość obowiązkową. Albo w swoim * .xcodatamodelu zaznacz pole „opcjonalne” lub podczas zapisywania w managedObjectContext upewnij się, że Twoje właściwości są wypełnione.
Jeśli po zmianie kodu w celu dopasowania do dwóch wymagań pojawiają się kolejne błędy, spróbuj wyczyścić kompilację i usunąć aplikację z urządzenia iPhone Simulator / iPhone. Twoja zmiana modelu może kolidować ze starą implementacją modelu.
Edytować:
Prawie zapomniałem o wszystkich kodach błędów, które wypluwa Core Data: Odniesienie do stałych danych podstawowych : Miałem z tym wcześniej problem i zdałem sobie sprawę, że odznaczyłem poprawne opcjonalne pole. Taki problem ze znalezieniem problemu. Powodzenia.
źródło
Sam przez chwilę z tym walczyłem. Prawdziwy problem polega na tym, że debugowanie, które masz, nie pokazuje, na czym polega problem. Powodem tego jest to, że CoreData umieści tablicę obiektów NSError w obiekcie NSError "najwyższego poziomu", który zwraca, jeśli jest więcej niż jeden problem (dlatego pojawia się błąd 1560, który wskazuje wiele problemów i tablicę błędów 1570). Wygląda na to, że CoreData ma kilka kluczy, których używa do przechowywania informacji w zwracanym błędzie, jeśli wystąpi problem, który da ci bardziej przydatne informacje (takie jak encja, w której wystąpił błąd, związek / atrybut, którego brakowało itp. ). Klucze używane do sprawdzania słownika informacji o użytkowniku można znaleźć w dokumentacji referencyjnej tutaj .
Oto blok kodu, którego używam, aby uzyskać rozsądne dane wyjściowe z błędu zwróconego podczas zapisywania:
Spowoduje to wyświetlenie danych wyjściowych z informacją o brakujących polach, co znacznie ułatwia rozwiązanie problemu.
źródło
Wrzucam to jako odpowiedź, chociaż jest to bardziej upiększenie fragmentu Charlesa. Proste wyjście z NSLog może być bałaganem do odczytania i zinterpretowania, więc lubię dorzucić trochę białych znaków i wywołać wartość niektórych krytycznych kluczy „userInfo”.
Oto wersja metody, której używałem. („_sharedManagedObjectContext” to #define dla „[[[UIApplication sharedApplication] delegate] managedObjectContext]”.)
To pozwala mi zobaczyć wartość `` NSValidationErrorKey '', która, gdy napotkałem problem z OP, wskazywała bezpośrednio na nie opcjonalne jednostki Core Data, których zapomniałem ustawić przed próbą zapisania.
źródło
Problem dotknął mnie, kiedy zapisuję drugi rekord w CoreData. Wszystkie pola nieobowiązkowe (relacja) zostały również wypełnione bez zera, ale w wyniku błędu zauważyłem, że jedno z pól w pierwszym zapisanym obiekcie stało się zerowe. Trochę dziwne? Ale powód jest dość banalny - relacja jeden do jednego, która unieważnia pierwszy obiekt, gdy ustawię go w drugim.
Tak więc schemat jest taki:
Zmiana relacji w Rodzinie z Jeden na Jeden na Wiele w Jeden rozwiązała to zadanie.
źródło
Miałem przejściową właściwość typu int, która nie była opcjonalna. Oczywiście przy ustawieniu na 0 pojawia się błąd 1570. Właśnie zmieniłem wszystkie moje właściwości przejściowe na opcjonalne. W razie potrzeby można zaimplementować w kodzie logikę zerową.
źródło
Oznacza to, że Twój model nie został zweryfikowany, co może się zdarzyć z wielu powodów: nieużywana właściwość w modelu, brakująca wartość oznaczona jako wymagana. Aby lepiej zrozumieć, co poszło nie tak, ustaw punkt przerwania w miejscu, w którym jesteś gotowy do zapisania obiektu, i wywołaj jeden z
validateFor...
wariantów metody, na przykład:po [myObject validateForInsert]
Bardziej szczegółowe informacje o problemie znajdują się w opisie błędu. Pomyślna weryfikacja oznacza, że nie otrzymasz żadnych wyników.
źródło
Pomogło mi. Sprawdź też to.
Zaznacz opcjonalne pole w obiektach * .xcodatamodel
źródło