nierozwiązany błąd danych podstawowych iphone ' a podczas zapisywania

Otrzymuję dziwny komunikat o błędzie z podstawowych danych podczas próby zapisania ale problem, że błąd nie jest powtarzalny (pojawia się w różnych momentach 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ę on w losowych momentach

Author: BoltClock, 2009-08-16

6 answers

Oznacza to, że obowiązkowa nieruchomość została przypisana zero. Albo w twoim *.xcodatamodel zaznacz pole "opcjonalne" lub podczas zapisywania w managedObjectContext upewnij się, że Twoje właściwości są wypełnione.

Jeśli po zmianie kodu pojawią się kolejne błędy, spróbuj wyczyścić kompilację i usunąć aplikację z symulatora iPhone 'a/urządzenia iPhone' a. Zmiana modelu może być sprzeczna ze starym modelem wdrożenie.

Edit:

Prawie zapomniałem oto wszystkie kody błędów, które Core Data wypluwa: Odniesienie Do Stałych Danych Podstawowych Miałem z tym wcześniej problem i zdałem sobie sprawę, że odznaczyłem poprawne opcjonalne pole. Takie kłopoty ze znalezieniem problemu. Powodzenia.

 289
Author: David Wong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-16 13:01:53

Sam przez jakiś czas się z tym zmagałem. Prawdziwym problemem jest to, że debugowanie, które masz, nie pokazuje, na czym polega problem. Powodem tego jest to, że CoreData umieści tablicę obiektów NSError w" najwyższym poziomie " obiekcie nserror, który zwraca, jeśli występuje więcej niż jeden problem (dlatego widzisz błąd 1560, który wskazuje na wiele problemów i tablicę błędów 1570s). Wygląda na to, że CoreData ma kilka kluczy, których używa do przechowywania informacji w błędzie zwraca, jeśli wystąpi problem, który dostarczy więcej przydatnych informacji (takich jak encja, na której wystąpił błąd, brakująca relacja/atrybut itp.). Klucze używane do sprawdzania słownika userInfo można znaleźć w dokumentacji referencyjnej tutaj .

Jest to blok kodu, którego używam, aby uzyskać rozsądne wyjście z błędu zwracanego podczas zapisu:

    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]);
        }
    }

Wygeneruje wyjście, które informuje o polach, których brakuje, co sprawia, że naprawienie problemu znacznie łatwiejsze w obsłudze.

 232
Author: Charles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-18 23:39:58

Wrzucam to jako odpowiedź, mimo że to bardziej upiększenie fragmentu Charlesa. Proste wyjście z NSLog może być bałaganem do czytania i interpretacji, więc lubię dorzucić trochę białej spacji i wywołać wartość niektórych krytycznych kluczy "userInfo".

Oto wersja metody, której używałem. ('_sharedManagedObjectContext 'jest #define dla' [[[UIApplication Sharedapplication] delegate] managedObjectContext]'.)
- (BOOL)saveData {
    NSError *error;
    if (![_sharedManagedObjectContext save:&error]) {
        // If Cocoa generated the error...
        if ([[error domain] isEqualToString:@"NSCocoaErrorDomain"]) {
            // ...check whether there's an NSDetailedErrors array            
            NSDictionary *userInfo = [error userInfo];
            if ([userInfo valueForKey:@"NSDetailedErrors"] != nil) {
                // ...and loop through the array, if so.
                NSArray *errors = [userInfo valueForKey:@"NSDetailedErrors"];
                for (NSError *anError in errors) {

                    NSDictionary *subUserInfo = [anError userInfo];
                    subUserInfo = [anError userInfo];
                    // Granted, this indents the NSValidation keys rather a lot
                    // ...but it's a small loss to keep the code more readable.
                    NSLog(@"Core Data Save Error\n\n \
                      NSValidationErrorKey\n%@\n\n \
                      NSValidationErrorPredicate\n%@\n\n \
                      NSValidationErrorObject\n%@\n\n \
                      NSLocalizedDescription\n%@", 
                      [subUserInfo valueForKey:@"NSValidationErrorKey"], 
                      [subUserInfo valueForKey:@"NSValidationErrorPredicate"], 
                      [subUserInfo valueForKey:@"NSValidationErrorObject"], 
                      [subUserInfo valueForKey:@"NSLocalizedDescription"]);
                }
            }
            // If there was no NSDetailedErrors array, print values directly
            // from the top-level userInfo object. (Hint: all of these keys
            // will have null values when you've got multiple errors sitting
            // behind the NSDetailedErrors key.
            else {
                    NSLog(@"Core Data Save Error\n\n \
                      NSValidationErrorKey\n%@\n\n \
                      NSValidationErrorPredicate\n%@\n\n \
                      NSValidationErrorObject\n%@\n\n \
                      NSLocalizedDescription\n%@", 
                      [userInfo valueForKey:@"NSValidationErrorKey"], 
                      [userInfo valueForKey:@"NSValidationErrorPredicate"], 
                      [userInfo valueForKey:@"NSValidationErrorObject"], 
                      [userInfo valueForKey:@"NSLocalizedDescription"]);

            }
        } 
        // Handle mine--or 3rd party-generated--errors
        else {
            NSLog(@"Custom Error: %@", [error localizedDescription]);
        }
        return NO;
    }
    return YES;
}

To pozwala mi zobaczyć wartość dla 'NSValidationErrorKey', która, gdy napotkałem problem z OP, wskazywała bezpośrednio na nieobowiązkowe podstawowe jednostki danych, które zapomniałem ustawić przed próbą zapisania.

 21
Author: clozach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-11 00:14:06

Problem dotknął mnie, kiedy zapisuję drugi rekord do CoreData. Wszystkie Nie opcjonalne pola (relacja) zostały wypełnione bez zera, ale w wyniku błędu zauważyłbym, że jedno z pól w pierwszym zapisanym obiekcie stało się zerowe. Trochę dziwnie? Ale powód jest dość trywialny - relacja jeden do jednego, która unieważnia pierwszy obiekt, gdy ustawiam go w drugim.

Więc schemat jest następujący:

"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)

Zmiana relacji w Rodzicu z jednego do jednego do wielu do jednego rozwiązała to zadanie.

 0
Author: HotJard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-09 15:43:42

Miałem przejściową właściwość typu int, która nie była opcjonalna. Oczywiście, gdy został ustawiony 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 logika Nil-check może być zaimplementowana w kodzie.

 0
Author: Anton Plebanovich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-12 10:50:21

I mean that your model failed to validate, which could happen for a number of reasons: unused property in your model, missing value that ' s marked as required. Aby lepiej zrozumieć, co dokładnie poszło nie tak, umieść punkt przerwania w miejscu, w którym jesteś gotowy do zapisania obiektu i wywołaj jeden z wariantów metody validateFor..., np.:

po [myObject validateForInsert]

Bardziej szczegółowe informacje na temat problemu znajdują się w opisie błędu. Pomyślna Walidacja oznacza, że nie otrzymasz żadnych wyników.

 0
Author: kkodev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-18 16:27:20