2016-08-02 14 views
0

Hallo Ich mache eine Synchronisierungsfunktion, die Datenbank zu aktualisieren, wenn JSON Antwort vom Server erhalten. Ich möchte, dass die Einfuhr nur dann erfolgen, wenn es unterschiedliche Daten (neuer Datensatz oder Aktualisierung vorhandener Datensatz) (Um die Leistung zu erhöhen) (Mit coredata und magicalRecord)iOS Magischer Datensatz Import von Array

Hier ist meine JSON-Parser-Methode

- (void)updateWithApiRepresentation:(NSDictionary *)json 
{ 
    self.title = json[@"Name"]; 
    self.serverIdValue = [json[@"Id"] integerValue]; 
    self.year = json[@"Year of Release"]; 
    self.month = json[@"Month of Release"]; 
    self.day = json[@"Day of Release"]; 
    self.details = json[@"Description"]; 
    self.coverImage = json[@"CoverImage"]; 
    self.thumbnail = json[@"Thumbnail"]; 
    self.price = json[@"Buy"]; 

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; 
    [formatter setDateFormat:@"dd/MMMM/yyy"]; 

    NSDate *date = [formatter dateFromString:[NSString stringWithFormat:@"%@/%@/%@",self.day,self.month,self.year]]; 
    self.issueDate = date; 
} 

Und mein Import-Methode

+ (void)API_getStampsOnCompletion:(void(^)(BOOL success, NSError  *error))completionBlock 
{ 
    [[ApiClient sharedInstance] getStampsOnSuccess:^(id responseJSON) { 

    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_context]; 
    NSMutableArray *stamps = [[NSMutableArray alloc]init]; 
    [responseJSON[@"root"] enumerateObjectsUsingBlock:^(id attributes, NSUInteger idx, BOOL *stop) { 
     Stamp *stamp = [[Stamp alloc]init]; 
     [stamp setOrderingValue:idx]; 
     [stamp updateWithApiRepresentation:attributes]; 
     [stamps addObject:stamp]; 
    }]; 

    [Stamp MR_importFromArray:stamps inContext:localContext]; 

} onFailure:^(NSError *error) { 
     if (completionBlock) { 
      completionBlock(NO, error); 
     } 
    }]; 
} 

ich erhalte Fehler

CoreData: error: Failed to call designated initializer on NSManagedObject class 'Stamp' 
2016-08-02 23:52:20.216 SingPost[2078:80114] -[Stamp setOrdering:]: unrecognized selector sent to instance 0x78f35a30 

Ich habe überprüft, dass mein Json-Parser funktioniert. Das Problem ist mit meiner Importmethode. Ich weiß nicht, was mit der Funktion nicht stimmt. Jede Hilfe ist sehr zu schätzen. Vielen Dank!

Antwort

1

Die Fehlermeldung beschreibt deutlich das genaue Problem. Sie tun dies:

Stamp *stamp = [[Stamp alloc]init]; 

Aber init nicht der designierte Initialisierer für NSManagedObject ist, es sei denn Sie init in der Unterklasse hinzugefügt (die Sie nicht tun nicht erwähnt). Sie müssen den designierten Initialisierer aufrufen, der initWithEntity:insertIntoManagedObjectContext: ist. Es gibt auch eine Convenience-Factory-Methode auf NSEntityDescription namens insertNewObjectForEntityForName:inManagedObjectContext:. Eines davon wird funktionieren, aber init wird nicht aufgerufen.

+0

Hallo Danke für Ihre Hilfe Ich arbeite mit Magical Record Bibliothek. ist das obige gleich Stamp * stamp = [Stamp MR_createEntityInContext: localContext] ;? eine Möglichkeit, doppelte zu vermeiden, wenn neue Datensatz hinzufügen? –

+0

Ich habe Magical Record nicht benutzt, daher kann ich mir nicht sicher sein. –

+0

Wissen Sie also, wie Sie das Hinzufügen eines doppelten Datensatzes vermeiden können (nach dem Empfang der JSON-Antwort vom Server)? –