web-dev-qa-db-fra.com

RLMException: la «propriété de clé primaire« série »n'existe pas sur l'objet« Book »Migration vers Swift 4

Je rencontre ce problème avec Realm sur iOS en utilisant Swift 4 compilation, où au démarrage, l'application se bloque 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 les mêmes. 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 n'avaient qu'un # (0,1,2) et aucune donnée. Si je commente la clé primaire, elle s'exécute, mais rien n'est stocké dans Realm pour cet objet. Je n'arrive pas à comprendre pourquoi ça plante!

13
Hellojeffy

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

De site Web du royaume :

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

19
Hellojeffy

Bien qu'il ne s'agisse pas nécessairement de migration, il y a un problème avec iOS 13 et Xcode 11 qui peut provoquer ce problème. Toutes les propriétés String des classes Realm avec une valeur par défaut String sont ignorées d'une manière ou d'une autre. Vous pouvez résoudre ce problème en effectuant une mise à jour vers la dernière version (actuellement 3.19.1) et sur Xcode: Product -> Clean Build Folder.

Si vous utilisez des cabosses de cacao, procédez comme suit:

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

pod 'RealmSwift', '~> 3.19.1'

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

pod repo update
pod install

J'espère que cela pourra aider.

34
Gal Shahar
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"
    }
}
5
Khawar Islam

Dans mon cas, l'ajout de @objMembers au-dessus du nom de classe l'a corrigé

Ex:

@objcMembers
internal final class Recipient: Mappable {
dynamic var transferID: String = ""
1
Kiki Sasha

J'ai eu un problème similaire, mais le mien était dû au fait que je convertissais une classe non-royaume en classe Realm. J'avais à l'origine:

@objc dynamic let customerId: String
override static func primaryKey() -> String? {
    return "customerId"
}

... mais je devais changer le "let" en "var":

@objc dynamic var customerId: String
override static func primaryKey() -> String? {
    return "customerId"
}

Il n'était pas évident d'après le message d'erreur que c'était le problème, mais cela a instantanément résolu le problème.

0
wildcat12

Changer de domaine dans le fichier Pod avec la nouvelle version de Realm comme:

De

pod 'RealmSwift', '~> 3.11.0'

À

 pod 'Realm',  git: 'https://github.com/realm/realm-cocoa.git', branch: 'master', submodules: true


  pod 'RealmSwift', git: 'https://github.com/realm/realm-cocoa.git', branch: 'master', submodules: true

assurez-vous que tous les champs sont définis comme:

 @objc dynamic var myID: String!
0
Deepak Kanyan