web-dev-qa-db-ja.com

レルムモデルの主キーをSwiftに設定する方法

新しいiOS SwiftプロジェクトでRealmを使用しています。iOSSDK 8.0およびRealm 0.85.0でXcode 6.0.1を使用しています

addOrUpdateObjectを実行できるように、新しいRealm主キー機能を使用しようとしています。

サンプルモデルを次に示します。

import Foundation
import Realm

class Foo: RLMObject {
    dynamic var id = 0
    dynamic var title = ""

    func primaryKey() -> Int {
        return id
    }
}

そして、私は新しいオブジェクトを追加/更新しようとしています:

let foo = Foo()
foo.title = titleField.text
foo.id = 1

// Get the default Realm
let realm = RLMRealm.defaultRealm()

// Add to the Realm inside a transaction
realm.beginWriteTransaction()
realm.addOrUpdateObject(foo)
realm.commitWriteTransaction()

私はこのエラーを受け取ります:

RLMExecption '、理由: `` Foo'には主キーがなく、更新できません

主キーに関するドキュメントは次のとおりです。私はおそらく正しく設定していません: http://realm.io/docs/cocoa/0.85.0/api/Classes/RLMObject.html#//api/name/primaryKey

最新のドキュメントはこちらです: https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey

38
jeffjv

primaryKeyは、主キーの値を返すインスタンスメソッドではなく、主キーであるプロパティの名前を返すクラス関数である必要があります。

class Foo: RLMObject {
    dynamic var id = 0
    dynamic var title = ""

    override class func primaryKey() -> String? {
        return "id"
    }
}
81
Thomas Goyne

primaryKey()の戻り型はオプションです。

class Foo: RLMObject {
    dynamic var id = 0
    dynamic var title = ""

    override class func primaryKey() -> String? {
        return "id"
    }
}
8
CherryKuczery

Swift 5:の場合

import RealmSwift

     class Signature: Object {

           @objc dynamic var id = ""

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

回避方法:キャッチされない例外 'RLMException'によるアプリの終了、理由: 'プライマリキープロパティ' id 'がオブジェクトに存在しません。

1
Maria Ortega