2013-11-26 15 views
5

Ich versuche meine Hand bei einigen grundlegenden Implementierung von MagicalRecord, um den Dreh raus zu bekommen und in die folgenden zu kommen.MagicalRecord speichert keine Daten

Wenn ich einen Eintrag speichern und dann Einträge dieses Typs abrufen, wird es mit dem Eintrag, den ich gerade gespeichert habe, kommen. Wenn ich den Eintrag jedoch speichere, schließe die App, starte sie erneut und hole sie ab, sie ist leer.

-Code für das Speichern:

- (void)createTestTask{ 
    NSManagedObjectContext *localContext = [NSManagedObjectContext contextForCurrentThread]; 

    Task *task = [Task createInContext:localContext]; 
    task.tName = @"First Task"; 
    task.tDescription = @"First Task created with MagicalRecord. Huzzah!"; 


    NSError *error; 
    [localContext save:&error]; 
    if (error != Nil) { 
     NSLog(@"%@", error.description); 
    } 
} 

-Code für das Abrufen: (alles, was ich will hier wissen, ob etwas tatsächlich gespeichert ist)

- (void) fetchTasks{ 
    NSArray *tasks = [Task findAll]; 
    NSLog(@"Found %d tasks", [tasks count]); 
} 

Ich bin sicher, dass ich hier etwas fehle, aber nicht alles, was ich auf Stackoverflow oder in den Tutorials, die ich angeschaut habe, zu finden scheint.

Jede Hilfe ist willkommen.

Antwort

8

Ich habe das offensichtlich zu fragen: „Ist es eingesteckt“ Frage: Haben Sie die Core Data-Stack mit einem der +[MagicalRecord setupCoreDataStack] Methoden initialisieren?

Wurde der Stapel ordnungsgemäß initialisiert? Das heißt, ist Ihr Geschäft und Modell kompatibel? Wenn dies nicht der Fall ist, richtet MagicalRecord (genauer gesagt Core Data) den gesamten Stack ohne den Persistent Store ein. Das ist ärgerlich, weil es so aussieht, als wäre alles in Ordnung, bis es nicht im Laden gespeichert werden kann ... weil es keinen Speicher gibt. MagicalRecord verfügt über eine +[MagicalRecord currentStack]-Methode, mit der Sie den aktuellen Status des Stapels untersuchen können. Versuchen Sie das im Debugger, nachdem Sie Ihren Stack eingerichtet haben.

Angenommen, Sie haben das getan, ist die andere Sache zu überprüfen, das Fehlerprotokoll. Wenn Sie

verwenden
[localContext MR_saveToPersistentStoreAndWait]; 

Alle Fehler sollten in der Konsole protokolliert werden. Wenn Daten bei einer späteren Ausführung Ihrer App nicht angezeigt werden, liegt dies in der Regel daran, dass die Daten nicht gespeichert wurden, als Sie der Ansicht waren, dass Sie "Speichern" aufgerufen haben. Und das Speichern geschieht wiederum nicht, weil Ihre Daten nicht korrekt validiert wurden. Ein allgemeines Beispiel ist, wenn Sie eine erforderliche Eigenschaft haben, und es ist immer noch Null zu der Zeit, die Sie speichern aufrufen. "Normale" Kerndaten protokollieren diese Probleme überhaupt nicht, also könnte es sein, dass es funktioniert hat, obwohl die Sicherungsoperation tatsächlich fehlgeschlagen ist. MagicalRecord hingegen erfasst all diese Fehler und protokolliert sie auf der Konsole, um Ihnen zumindest zu sagen, was mit Ihren Daten passiert.

+1

Der saveToPersistentStoreAndWait hat den Trick. Der currentStack zeigte, dass es zumindest so funktionierte, wie es sollte. Nicht sicher, warum die Sicherung nicht ordnungsgemäß ausgeführt wurde, sondern saveToPersistentStoreAndWait. Irgendwelche Ideen dazu? – ophychius

3

Wenn ich mit magischen Aufzeichnungen begonnen habe, war ich auch mit diesem Problem konfrontiert, Problem ist Kontext, den Sie verwenden, um Daten zu speichern. hier ist mein Code, der Ihnen helfen könnte

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 

       NSArray *userInfoArray = [UserBasicInfo findByAttribute:@"userId" withValue:[NSNumber numberWithInt:loggedInUserId] inContext:localContext]; 

       UserBasicInfo* userInfo; 

       if ([userInfoArray count]) { 
        userInfo = [userInfoArray objectAtIndex:0]; 
       } else { 
        userInfo = [UserBasicInfo createInContext:localContext]; 
       } 

       userInfo.activeUser = [NSNumber numberWithBool:YES]; 
       userInfo.firstName = self.graphUser[@"first_name"]; 
       userInfo.lastName = self.graphUser[@"last_name"]; 
       userInfo.userId = @([jsonObject[@"UserId"] intValue]); 
       userInfo.networkUserId = @([jsonObject[@"NetworkUserId"] longLongValue]); 
       userInfo.userPoint = @([jsonObject[@"PointsEarned"] floatValue]); 
       userInfo.imageUrl = jsonObject[@"Picturelist"][0][@"PictureUrL"]; 
       userInfo.imageUrlArray = [NSKeyedArchiver archivedDataWithRootObject:jsonObject[@"Picturelist"]]; 
      } completion:^(BOOL success, NSError *error) { 

      }]; 
0

verwenden, wenn Sie fertig sind

[[NSManagedObjectContext MR_defaultContext]saveToPersistentStoreAndWait]; 
+0

Diese Frage wurde bereits beantwortet ... und was Sie erwähnt haben, war Teil der ursprünglichen Antwort .... – ophychius

Verwandte Themen