2016-07-31 33 views
3

Ich habe ein Realm-Objekt namens Restaurant in meiner App. Dieses Restaurant Objekt hat viele Table Objekte, die damit verbunden sind. Wenn ich auf speichern, sieht es wie folgt aus:Überprüfen, ob Realm-Objekt bereits existiert

Restaurant *restaurant = [[Restaurant alloc] init]; 
restaurant.url = [_userData url]; 
restaurant.type = [_userData kind]; 

for (int i = 0; i < [[_userData tables] count]; i++) { 
    Input *input = [[_userData tables] objectAtIndex:i]; 
    Table *table = [[Table alloc] init]; 

    table.title = input.title; 
    table.seats = input.seats; 
    table.type = input.type; 

    [restaurant.tables addObject:table]; 
} 

RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration]; 
config.fileURL = [NSURL URLWithString:[Preferences getRealmPath]]; 
RLMRealm *realm = [RLMRealm realmWithConfiguration:config error:nil]; 

[realm beginWriteTransaction]; 
[realm addObject:restaurant]; 
[realm commitWriteTransaction]; 

Nun, was ich will, ist, dass, wenn ein Restaurant hinzugefügt wird, aber es existiert bereits in dieser Konfiguration ist es nicht gespeichert. Aber wenn das gleiche Restaurant hinzugefügt wird, aber etwas ist anders - auch wenn es die Menge der Sitze an 1 Tisch ist - sollte es hinzugefügt werden. Was ist der beste Weg, dies zu erreichen?

Antwort

2

Realm unterstützt etwas namens primary keys, die wie eine gute Passform für Ihr Problem scheinen.

Ein Primärschlüssel ist eine eindeutige Kennung für ein Realm-Objekt. Es kann eine Ganzzahl oder eine Zeichenfolge sein. In Ihrem Fall könnten Sie die URL als Primärschlüssel verwenden (wenn jedes Restaurant tatsächlich nur einer URL zugeordnet ist) oder eine neue Eigenschaft hinzufügen, die als Primärschlüssel dient (z. B. ein Feld name).

Sie können dann die addOrUpdateObject: Methode anstelle der Methode verwenden. Diese Methode funktioniert nur für Objekttypen mit Primärschlüsseln.

In Ihrem Fall, vorausgesetzt, Sie einen Primärschlüssel für Ihre Restaurant Modelltyp einrichten, Realm würde eine der folgenden Aktionen ausführen:

  • Wenn die Restaurant zuvor dem Realm wurde zugegeben, und hat sich nicht geändert in Bezug auf Dein neues Modell, nichts wird sich ändern.
  • Wenn die Restaurant zuvor dem Realm hinzugefügt wurde, aber Ihr Modell sich seitdem geändert hat, wird das vorhandene Modell im Realm aktualisiert.
  • Wenn das Restaurant nicht zuvor dem Realm hinzugefügt wurde, wird es hinzugefügt.

Hoffe, dass hilft.

+0

Nun, ich weiß über Primärschlüssel und ich dachte über sie nach. * Aber *, der Benutzer kann die Daten eingeben, so dass es mehrere Instanzen eines Restaurants geben kann, in denen nur eine Tabelle geändert wurde. Alle diese sollten gespeichert werden. Es sollte nicht gespeichert werden, wenn es eine 1: 1 Übereinstimmung ist. – user4992124

+0

In diesem Fall möchten Sie wahrscheinlich [query] (https://realm.io/docs/swift/latest/#filtering) in Ihrem Realm für alle Restaurants mit URL, Typ und Anzahl der Tabellen abfragen als das neue 'Restaurant', das du hinzufügen möchtest. Wenn die Ergebnisse dieser Abfrage leer sind, können Sie einfach das neue Modell hinzufügen. Andernfalls können Sie in jedem Ergebnis durch die 'Table's iterieren und auf Gleichheit prüfen (wahrscheinlich wollen Sie' isEqual: 'für diese Klasse außer Kraft setzen); Wenn keines der Ergebnisse identische Tabellen zu Ihrem Modell hat, wissen Sie, dass Sie es hinzufügen können. – AustinZ

+0

Das ist ziemlich ressourcenintensiv, nicht wahr? Ich würde wirklich gerne wissen, ob es keinen besseren Weg gibt. – user4992124

0

Eine Lösung wäre, einen Primärschlüssel zu erstellen, der den Wert hashed. d. h. Erstellen eines Hashs aus den Daten, die einigermaßen eindeutig sind. Hash den Namen des Restaurants und Tabellennamen zum Beispiel.

Dann müssten Sie Eimer für jeden Hash-Wert haben, die die Restaurants enthalten würde, die es getroffen haben.

Wenn ein neu eingegebenes Restaurant keinen Hash enthält, kann es einfach zum Bucket hinzugefügt werden. Andernfalls wird geprüft, ob es mit einem vorhandenen Restaurant im Bucket übereinstimmt, um die Eindeutigkeit zu prüfen.

Verwandte Themen