RLM异常:'主键属性'serial'在对象'Book'上不存在正在迁移到Swift 4

vojdkbi0  于 2022-12-26  发布在  Swift
关注(0)|答案(8)|浏览(145)

我在使用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应用程序检查默认的.realm文件时,我注意到这些条目只有一个#(0,1,2),其中没有数据。如果我注解掉主键,它会运行,但在Realm中没有存储此对象的任何内容。不知道为什么它会崩溃!

wyyhbhjk

wyyhbhjk1#

计算主键不起作用(如从嵌入式对象劫持id,见下面的代码):

@objc dynamic var id: String
{
    guard let id = header?.id else {
        assertionFailure()
        return ""
    }
    return id
}

因此,您必须在init()中创建一个普通的@Persisted var id: String集,并可能使用didSet跟踪one2one依赖关系(在我的示例中,头文件具有键)。领域对象观察器realm swift: how could I trap on object being invalidated?。可能会有一些用处吗?我认为didSet应该足够了。

5us2dqdw

5us2dqdw2#

在我的情况下,同样的问题诞生了,我忘记在参数中写入@objc

我的案例错误是

dynamic var yourValue: String!

修复

@objc dynamic var yourValue: String!
ee7vknir

ee7vknir3#

虽然这不一定是关于迁移,但iOS 13和Xcode 11中有一个问题可能会导致这个问题。Realm类的所有String属性都被忽略了,默认值为String。你可以通过更新到最新版本(目前是3.20.0)来修复这个问题,然后在Xcode上:产品-〉全新构建文件夹。
如果你用的是可可豆,请这样做:
打开项目的Podfile,并将RealmSwift行替换为:

pod 'RealmSwift', '~> 3.20.0'

然后,在项目文件夹中打开终端,并:

pod repo update
pod install
wko9yo5t

wko9yo5t4#

在Realm中,模型的属性必须具有@objc dynamic var属性,这正是我所缺少的。
来自Realm网站:
领域模型属性必须具有@objc dynamic var属性才能成为基础数据库数据的访问器。请注意,如果类声明为@objcMembers(Swift 4或更高版本),则单个属性只能声明为dynamic var

w80xi6nr

w80xi6nr5#

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"
    }
}
tvmytwxo

tvmytwxo6#

我有一个类似的问题,但我的是由于事实上,我正在转换一个非领域类领域类。我原来有:

@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"
}

从错误消息中看不出这是问题所在,但它立即修复了问题。

2sbarzqh

2sbarzqh7#

使用新版本的Realm更改Pod文件中的Realm,如下所示:

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

确保所有字段定义如下:

@objc dynamic var myID: String!
wfveoks0

wfveoks08#

在我的例子中,在类名的顶部添加@objMembers可以解决这个问题
例如:

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

相关问题