2016-08-05 33 views
1

Ich habe CatalogItem Objekte mit Primärschlüssel in meinem Code. Realm wirft einen Fehler beim Schreiben in den folgenden Code:Bestehendes Objekt an Realm List anhängen

class CartItem: Object { 
    dynamic var id: Int = 0 
    dynamic var item: CatalogItem! 
    dynamic var amount: Int = 0 

    convenience required init(id: Int, item: CatalogItem, amount: Int) { 
     self.init() 
     self.id = id 
     self.item = item 
     self.amount = amount 
    } 
} 

class Cart: Object { 

    var items = List<CartItem>() 

    func addItem(item: CatalogItem) { 
     let realm = try! Realm() 
     let newItem = CartItem(id: item.id, item: item, amount: 1) 
     do { 
      try realm.write { 
       items.append(newItem) 
      } 
     } catch let e { 
      handleError(e) 
     } 
    } 
} 

Fehler:

'RLMException', reason: 'Can't set primary key property 'id' to existing value '352'.' 

I Realm erwarten CatalogItem zu verweisen bestehende, aber es sieht aus wie ein weiteres hinzuzufügen versucht. Gibt es eine Möglichkeit, diese Art von Beziehung zu implementieren? Hinweis: Alle Objekte werden in einem Bereich gespeichert.

+0

Nun, ich erstelle kein anderes Objekt, ich referenziere existierende. Ich meine, 'CartItem' hat keinen Primärschlüssel. Nur das Element, auf das es verweist - 'CatalogItem' hat eins. Aber ich rufe 'CatalogItem.init()' nirgendwo auf, warum wird es also neu erstellt? – charlag

+0

Ja, Sie haben recht, es ist kein Dupon, aber die Antwort ist fast die gleiche, Sie können nicht zwei Objekte mit dem gleichen Primärschlüssel haben – Idan

+0

Lassen Sie mich die Frage stellen: wenn ich 'CartItem' und pass' erstelle CatalogItem' wird Realm versuchen, ein anderes 'CatalogItem' zu erstellen? – charlag

Antwort

1

wie jpsim erwähnt, das Problem ist, dass ich versuche, nicht verwalteten Objekt zu Realm anhängen, und es ist ein Objekt mit dem gleichen Primärschlüssel in der Datenbank. Ich musste das Problem anders lösen, weil die vorgeschlagene Lösung die Eigenschaften des Objekts, das im Bereich existiert, löschen würde.

func addItem(item: CatalogItem) { 
    let realm = try! Realm() 
    var catalogItem = item 
    if item.realm == nil, 
     let foundItem = realm.objects(CatalogItem) 
      .filter("id == %@", item.id).first { 
     catalogItem = foundItem 
    } 
    let newItem = CartItem(id: item.id, item: catalogItem, amount: 1) 
    do { 
     try realm.write { 
      items.append(newItem) 
     } 
    } catch let e { 
     handleError(e) 
    } 
} 
2

Wenn Sie ein nicht verwaltetes Realm-Objekt an ein verwaltetes List anhängen, wird das nicht verwaltete Objekt erstellt. Es ist jedoch ein Fehler, ein Objekt mit einem vorhandenen Primärschlüssel zu erstellen. Sie können Realm.add(_:update: true) verwenden, um anzugeben, dass Sie das Objekt erstellen möchten, wenn es nicht existiert, andernfalls um die Eigenschaften des vorhandenen Objekts mit den neuen Werten zu aktualisieren.

Also ich denke, dass Sie Ihre addItem() Funktion möchten wie folgt aussehen:

func addItem(item: CatalogItem) { 
    let realm = try! Realm() 
    let newItem = CartItem(id: item.id, item: item, amount: 1) 
    do { 
     try realm.write { 
      realm.add(newItem, update: true) 
      items.append(newItem) 
     } 
    } catch let e { 
     handleError(e) 
    } 
} 
+0

Danke! Das war genau mein Problem, aber ich musste es anders lösen. – charlag