11 votes

RLMException : 'Primary key property 'serial' does not exist on object 'Book' Migrations vers Swift 4

Je rencontre ce problème avec Realm sur iOS en utilisant la compilation Swift 4. Au démarrage, l'application se plante avec le message suivant

RLMException', reason: 'Primary key property 'serial' does not exist on object 'Book''

J'ai vu des messages d'erreur similaires, mais pas le même. Voici à quoi ressemble mon objet

import Foundation
import RealmSwift

class Book: Object {
    dynamic var serial: String = ""
    dynamic var title: String = ""
    dynamic var pages: Int = 0
    dynamic var genre: String = ""

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

Lorsque j'ai vérifié le fichier default.realm via l'application Realm Browser, j'ai remarqué que les entrées ne comportaient qu'un # (0,1,2) et aucune donnée. Si je commente la clé primaire, le programme fonctionne, mais rien n'est stocké dans Realm pour cet objet. Je n'arrive pas à comprendre pourquoi il se bloque !

38voto

Gal Shahar Points 333

Bien que cela ne concerne pas nécessairement la migration, il y a un problème avec iOS 13 et Xcode 11 qui peut causer ce problème. Toutes les propriétés String des classes Realm avec une valeur par défaut String sont en quelque sorte ignorés. Vous pouvez résoudre ce problème en mettant à jour la dernière version (actuellement 3.20.0) et ensuite sur Xcode : Produit -> Nettoyer le dossier de construction.

Si vous utilisez des gousses de cacao, faites ceci :

Ouvrez le Podfile de votre projet, et remplacez la ligne RealmSwift par :

pod 'RealmSwift', '~> 3.20.0'

Ensuite, ouvrez le terminal sur le dossier du projet et :

pod repo update
pod install

J'espère que cela vous aidera.

21voto

Hellojeffy Points 49

Dans Realm, les propriétés de votre modèle doivent avoir l'attribut @objc dynamic var attribut, c'est ce qui me manquait.

De Site web de Realm :

Les propriétés du modèle Realm doivent avoir l'attribut @objc dynamic var pour devenir des accesseurs pour les données de la base de données sous-jacente. Notez que si la classe est déclarée comme @objcMembers (Swift 4 ou plus), les propriétés individuelles peuvent simplement être déclarées en tant que dynamic var .

6voto

Khawar Islam Points 1
import Foundation
import RealmSwift

class Book: Object {
   @objc dynamic var id : Int = 0
   @objc dynamic var serial: String = ""
   @objc dynamic var title: String = ""
   @objc dynamic var pages: Int = 0
   @objc dynamic var genre: String = ""

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X