2017-10-02 21 views
0

私はプロジェクトを作成しています。 userIDが既に存在する場合は、そのユーザーを追加しません。しかし、何とか私のコードが適切に動作していません。レルムオブジェクトを使用してユーザーを保存

これは私のレルムモデルオブジェクト(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" 
    } 
} 

そして、これは、ユーザーを追加するためのボタンである。

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

は、時にはそれは、コードを実行されますが、時間のほとんどそれはエラーでクラッシュします:

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

+0

DBにクエリを行い、その中のすべてのユーザーに対してテストする必要があります。 if文は常に新しく作成されたUserでテストするため、常にtrueになります。 – kirander

+0

例外のメッセージは何ですか? –

答えて

0

あなたはwriteクロージャ内trueupdateパラメータを設定している場合、あなたはあなたのUserオブジェクト、Realm can handle this automaticallyの主キーを定義したように。

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

updateパラメータが設定されたりfalseされていない場合は、既存の主キーを持つオブジェクトを追加しようとすると、レルムは例外をスローします。

これは、if/else状態が役に立たないようにします。それは取り除くことができます。

ユーザーがすでに存在しているかどうかを知る必要がある場合は、主キーの値を持つレルムを要求することができます:ユーザーが存在しない場合

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

結果はnilになります。

+0

実際に動作します。しかし、ユーザが既に存在する場合、ブール値 '@objc dynamic var myBool = Bool()'を更新する別の関数があります。このコードはどのように機能しますか? –

+0

Realmに対して、realm.object(ofType:User.self、forPrimaryKey:userId)!= nil'のような主キーでリクエストを行うことができます。ユーザーが既に存在する場合、これは 'true'を返します。 – Sparga

+0

だから、これは次のようになります:http://oi68.tinypic.com/e7gvt1.jpg?それはまだそれをクラッシュさせる。 –

関連する問題