我使用Swift 4编译在iOS上遇到Realm问题,在启动时应用程序崩溃并显示以下消息
RLMException', reason: 'Primary key property 'serial' does not exist on object 'Book''
我看到了类似的错误消息,但不是同一个消息。 这就是我的对象的样子
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"
}
}
当我通过Realm Browser应用程序检查default.realm文件时,我注意到这些条目只有#(0,1,2)并且没有数据。如果我注释掉主键,它会运行,但Realm中没有任何内容存储在此对象中。无法弄清楚它为什么会崩溃!
答案 0 :(得分:44)
尽管不一定与迁移有关,但iOS 13和Xcode 11可能会导致此问题。设置了默认String
值的Realm类的所有String属性都被忽略了。
您可以通过更新到最新版本(当前为3.20.0)和Xcode上的Product-> Clean Build Folder来解决此问题。
如果您使用的是可可粉,请执行以下操作:
打开项目的Podfile,并将RealmSwift行替换为:
pod 'RealmSwift', '~> 3.20.0'
然后,打开项目文件夹中的终端,然后:
pod repo update
pod install
希望有帮助。
答案 1 :(得分:9)
在Realm中,模型的属性必须具有@objc动态var属性,这就是我所缺少的。
Realm model properties must have the @objc dynamic var attribute to become accessors for the underlying database data. Note that if the class is declared as @objcMembers (Swift 4 or later), the individual properties can just be declared as dynamic var.
答案 2 :(得分:3)
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"
}
}
答案 3 :(得分:1)
我有一个类似的问题,但是我的原因是我将非Realm类转换为Realm类。我原来有:
@objc dynamic let customerId: String
override static func primaryKey() -> String? {
return "customerId"
}
...但是我需要将“ let”更改为“ var”:
@objc dynamic var customerId: String
override static func primaryKey() -> String? {
return "customerId"
}
从错误消息中看不出来是问题所在,但它立即解决了问题。
答案 4 :(得分:0)
使用新版本的Realm更改Pod文件中的Realm:
来自
pod 'RealmSwift', '~> 3.11.0'
TO
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
确保所有字段都定义为:
@objc dynamic var myID: String!
答案 5 :(得分:0)
就我而言,在类名的顶部添加@objMembers即可解决
例如:
@objcMembers
internal final class Recipient: Mappable {
dynamic var transferID: String = ""
答案 6 :(得分:0)
经过数小时的尝试后,我遇到了同样的问题,我通过使用 var 而不是常量来解决它,即将 let 替换为 var,在我的情况下,它现在工作正常。