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!
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 commedynamic var
.
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.
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"
}
}
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 = ""
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.
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!