2017-01-19 3 views
0

Ok, hier ist mein Problem. Ich synchronisiere Daten von einem Server über eine REST-API. Die zurückgegebenen Daten befinden sich in JSON, ich durchlaufe sie und ergreife entsprechende Aktionen abhängig von den Daten. Das heißt, ich speichere es entweder als neues Objekt, aktualisiere das Objekt, wenn es bereits existiert, oder lösche es, wenn es nur lokal existiert.NSPredicate mit "NOT IN" Bedingung schlägt fehl

Um dies zu erreichen, sammle ich die IDs von den zurückgegebenen Objekten, wenn ich den JSON durchlaufen. Dies gibt mir einen Index aller zurückgegebenen Objekte. Ich frage dann meine lokal gespeicherten Daten ab, um zu sehen, ob sie irgendwelche Objekte enthält, die gelöscht werden sollen (mit anderen Worten, ob die lokale ID in der JSON-Antwort existiert oder nicht).

Und hier ist mein Problem (Entschuldigung für einen etwas längeren Prolog); das NSPredikat, das ich benutze funktioniert nur für bestimmte Szenarien und welche funktionieren oder scheitern scheint zufällig zu sein.

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 

    // Array which populates with the IDs from the server 
    NSMutableArray *arrayOfLogIDS = [[NSMutableArray alloc] init]; 

    /* 
    Fetching and parsing JSON ... collecting IDs and adding them to the array. See example below; 
    */ 
    NSArray *logs = [[json valueForKey:@"Logs"] valueForKey:@"Object"]; 

    // Looping through the logs array 
    for (NSArray *log in logs) { 

     [arrayOfLogIDS addObject:[log valueForKey:@"serverID"]]; 

    } 
    // The NSPredicate 
    NSPredicate *serverIDS = [NSPredicate predicateWithFormat:@"NOT (serverID IN %@)", arrayOfLogIDS]; 

    // The array which holds the objects that should be deleted 
    NSArray *logs = [Logs MR_findAllWithPredicate:serverIDS inContext:localContext]; 

}]; 

Das Problem ist nur, dass die NSPredicate nicht für diesen speziellen Umständen arbeiten. Es gibt keine Ergebnisse zurück, obwohl ich weiß, dass ich Objekte lokal habe, die gelöscht werden sollten. Ich verwende diesen Ansatz an anderen Stellen in der Anwendung, und es funktioniert wie erwartet. Wie Sie sehen können, verwende ich Magical Record für Core Data Management in dieser App.

Ich habe das Gefühl, dass ich die Dinge komplett ausprobiert habe, um es als nächstes zu versuchen, also würde jede Hilfe sehr geschätzt werden! :)

+0

Können Sie mir sagen, wo Sie Daten in Ihr 'ArrayOfLogIDS' Array füllen? – CodeChanger

+0

Ich habe die Frage bearbeitet, danke fürs Betrachten! :) – cmeriksson

+0

Ihre Verwendung von NOT IN sieht richtig aus. Vielleicht ist das Problem woanders. – danh

Antwort

0

Ok, wie sich herausstellt, hatte das Array von IDs manchmal die Werte als Zeichenfolge und manchmal als ganze Zahlen gespeichert. Ganzzahlen funktionierten gut mit NSPredicate, Strings nicht so sehr :) Gelöst! Vielen Dank für Ihre Zeit.