2017-10-02 3 views
0

Je crée un projet. Je veux si le userID existe déjà, il n'ajoute pas l'utilisateur. Mais d'une manière ou d'une autre, mon code ne fonctionne pas correctement.Enregistrer l'utilisateur à l'aide d'un objet de domaine

Ceci est mon modèle objet Realm (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" 
    } 
} 

Et c'est le bouton pour ajouter des utilisateurs:

@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") 
     } 
    } 

Parfois, il exécute le code, mais la plupart du temps il se bloque avec erreur:

libc++abi.dylib: terminating with uncaught exception of type NSException.

+0

Vous devez interroger la base de données et effectuer des tests sur tous les utilisateurs qui s'y trouvent. Votre instruction if sera toujours vraie car vous testez toujours avec un utilisateur nouvellement créé. – kirander

+0

Quel est le message de l'exception? –

Répondre

0

Comme vous avez défini une clé primaire dans votre objet User, Realm can handle this automatically si vous définissez le paramètre update à l'intérieur de la fermeture truewrite.

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

Si le paramètre update est pas défini ou false, Royaume lancera une exception lorsque vous essayez d'ajouter un objet avec une clé primaire existante.

Ceci rend la condition if/else inutile. Il peut être retiré.

Si vous avez besoin de savoir si l'utilisateur existe déjà, vous pouvez demander le royaume avec la valeur de clé primaire:

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

Le résultat sera nil si l'utilisateur n'existe pas.

+0

Cela fonctionne réellement. Mais j'ai une autre fonction où il mettra à jour un booléen '@objc dynamique var myBool = Bool()' si l'utilisateur existe déjà. Comment cela fonctionnera-t-il avec ce code? –

+0

Vous pouvez faire une requête sur votre domaine avec la clé primaire comme ceci: 'realm.object (ofType: User.self, forPrimaryKey: userId)! = Nil'. Cela retournera 'true' si l'utilisateur existe déjà. – Sparga

+0

Alors ça devrait être comme ça: http://oi68.tinypic.com/e7gvt1.jpg? Cela fait toujours planter. –