web-dev-qa-db-fra.com

Comment définir la clé primaire dans Swift pour le modèle Realm

J'utilise Realm dans un nouveau projet iOS Swift. J'utilise Xcode 6.0.1 avec iOS SDK 8.0 et Realm 0.85.0

J'essaie d'utiliser la nouvelle fonctionnalité de clé primaire de Realm pour pouvoir faire un addOrUpdateObject.

Voici un exemple de modèle:

import Foundation
import Realm

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

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

Et comment j'essaye d'ajouter/mettre à jour un nouvel objet:

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()

Je reçois cette erreur:

RLMExecption ', raison:' 'Foo' n'a pas de clé primaire et ne peut pas être mis à jour

Voici les documents sur la clé primaire. Je ne le configure probablement pas correctement: http://realm.io/docs/cocoa/0.85.0/api/Classes/RLMObject.html#//api/name/primaryKey

Les derniers documents sont ici maintenant: https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey

38
jeffjv

primaryKey doit être une fonction de classe qui retourne le nom de la propriété qui est la clé primaire, pas une méthode d'instance qui retourne la valeur de la clé primaire.

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

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

Le type de retour de primaryKey() est facultatif:

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

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

Pour Swift 5:

import RealmSwift

     class Signature: Object {

           @objc dynamic var id = ""

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

Pour éviter: Mettre fin à l'application en raison d'une exception non interceptée 'RLMException', raison: 'Propriété de clé primaire' id 'n'existe pas sur l'objet.

1
Maria Ortega