RLMException:'主要关键属性' serial'在对象上不存在' Book'迁移到Swift 4

时间:2018-02-15 15:10:58

标签: ios swift realm

我使用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中没有任何内容存储在此对象中。无法弄清楚它为什么会崩溃!

7 个答案:

答案 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 website

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,在我的情况下,它现在工作正常。