【问题标题】:How to set primary key in Swift for Realm model如何在 Swift for Realm 模型中设置主键
【发布时间】:2014-11-26 22:28:23
【问题描述】:

我在一个新的 iOS Swift 项目中使用 Realm。我将 Xcode 6.0.1 与 iOS SDK 8.0 和 Realm 0.85.0 一起使用

我正在尝试使用新的 Realm 主键功能,以便我可以使用addOrUpdateObject

这是一个示例模型:

import Foundation
import Realm

class Foo: RLMObject {
    dynamic var id = 0
    dynamic var title = ""

    func primaryKey() -> Int {
        return id
    }
}

以及我如何尝试添加/更新新对象:

let foo = Foo()
foo.title = titleField.text
foo.id = 1

// Get the default Realm
let realm = RLMRealm.defaultRealm()

// Add to the Realm inside a transaction
realm.beginWriteTransaction()
realm.addOrUpdateObject(foo)
realm.commitWriteTransaction()

我收到此错误:

RLMExecption',原因:''Foo' 没有主键,不能 更新了

这里是关于主键的文档。我可能没有正确设置它: http://realm.io/docs/cocoa/0.85.0/api/Classes/RLMObject.html#//api/name/primaryKey

最新文档现在在这里: https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey

【问题讨论】:

  • 到 realm.io 文档的链接断开
  • 在启动 Realm Swift 时,我们已将“cocoa”文档移至“objc”,因此请尝试使用此链接:realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/…我们正在设置旧链接的重定向,所以这不会在未来造成同样多的混乱。
  • 从旧链接到新文档的重定向似乎不起作用,所以我用新链接更新了我的问题。

标签: ios swift realm


【解决方案1】:

primaryKey 需要是返回主键属性名称的类函数,而不是返回主键值的实例方法。

@objcMembers class Foo: RLMObject {
    dynamic var id = 0
    dynamic var title = ""

    override class func primaryKey() -> String? {
        return "id"
    }
}

【讨论】:

  • 谢谢,是的,这些都是我的问题。此外,为了使其正常工作,我添加了“覆盖”来覆盖声明。
  • 我已经更新了答案以包含 Realm 正确调用自定义类函数所需的“覆盖”关键字
  • 由于某种原因,我收到“'primaryKey()' 的无效重新声明”错误。似乎无法弄清楚为什么。
  • @Entalpi 我更新了文档realm.io/docs/cocoa/0.89.2/#customizing-models,您仍然看到任何错误吗?如果您愿意,请随时在groups.google.com/forum/#!forum/realm-cocoa 上留言,并附上您的代码示例
  • 根据@CherryKuczery,返回类型是可选的。如果我有足够的声誉,我会合并这两个答案。
【解决方案2】:

primaryKey()的返回类型是可选的:

class Foo: RLMObject {
    dynamic var id = 0
    dynamic var title = ""

    override class func primaryKey() -> String? {
        return "id"
    }
}

【讨论】:

  • 感谢您添加此内容,看起来已接受的答案已更改以反映可选的返回类型。
【解决方案3】:

对于 Swift 5:

import RealmSwift

     class Signature: Object {

           @objc dynamic var id = ""

            override static func primaryKey() -> String? {
                return "id"
            }
      }

为避免:由于未捕获的异常“RLMException”而终止应用程序,原因:“对象上不存在主键属性“id”。

【讨论】:

  • 这个答案拯救了我的一天!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
相关资源
最近更新 更多