2017-10-02 6 views
0

Ich erstelle ein Projekt. Ich möchte, wenn die userID bereits vorhanden ist, wird der Benutzer nicht hinzugefügt. Aber irgendwie funktioniert mein Code nicht richtig.Benutzer mit Realm-Objekt speichern

Das ist mein Reich Modell Object (User.swift):

import Foundation 
import RealmSwift 

class User: Object { 

    @objc dynamic var userID = Int() 
    @objc dynamic var username = "" 
    @objc dynamic var full_name = "" 
    @objc dynamic var myBool = Bool() 

    override static func primaryKey() -> String? { 
     return "userID" 
    } 
} 

Und das ist die Schaltfläche Benutzer hinzufügen:

@IBAction func add(_ sender: Any) { 
     let myUser = User() 
     let JSON_userID = Int(arc4random_uniform(5)) // This is temporary. I am going to get code from JSON, but using random for testing purpose. 

     if (myUser.userID != JSON_userID) { 
      myUser.userID = JSON_userID 
      myUser.username = "myUsername" 
      myUser.full_name = "My Name" 

      let realm = try! Realm() 
      try! realm.write { 
       realm.add(myUser) 
      } 
     } 
     else { 
      print("Already exist") 
     } 
    } 

Manchmal läuft es den Code, aber die meisten der Zeit es stürzt mit Fehler ab:

.

+0

Sie müssen DB abfragen und gegen alle Benutzer testen. Ihre if-Anweisung wird immer wahr sein, da Sie immer mit neu erstellten Benutzer testen. – kirander

+0

Was ist die Nachricht der Ausnahme? –

Antwort

0

Wie definiert man einen Primärschlüssel in Ihrem User Objekt, Realm can handle this automatically, wenn Sie den update Parameter true innerhalb des write Verschluss.

let realm = try! Realm() 
try! realm.write { 
    realm.add(myUser, update: true) 
} 

Wenn die update Parameter nicht gesetzt oder false, Realm wird eine Ausnahme ausgelöst, wenn Sie versuchen, ein Objekt mit einem vorhandenen Primärschlüssel hinzuzufügen.

Dies macht die if/else Bedingung nutzlos. Es kann entfernt werden.

Wenn Sie wissen müssen, wenn der Benutzer bereits vorhanden ist, können Sie das Reich mit dem Primärschlüsselwert anfordern:

realm.object(ofType: User.self, forPrimaryKey: JSON_userID) 

Das Ergebnis nil sein wird, wenn der Benutzer nicht existiert.

+0

Das funktioniert tatsächlich. Aber ich habe eine andere Funktion, wo es ein boolesches '@objc dynamisches var myBool = Bool()' aktualisiert, wenn der Benutzer bereits existiert. Wie wird das mit diesem Code funktionieren? –

+0

Sie können eine Anfrage in Ihrem Realm mit dem Primärschlüssel wie folgt machen: 'realm.object (ofType: User.self, forPrimaryKey: userId)! = Nil'. Dies wird 'wahr' zurückgeben, wenn der Benutzer bereits existiert. – Sparga

+0

So sollte es dann so sein: http://oi68.tinypic.com/e7gvt1.jpg? Das bringt es immer noch zum Absturz. –

Verwandte Themen