如何在 Swift for Realm 模型中设置主键

Posted

技术标签:

【中文标题】如何在 Swift for Realm 模型中设置主键【英文标题】:How to set primary key in Swift for Realm model 【发布时间】: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/…我们正在设置旧链接的重定向,所以这不会在未来造成同样多的混乱。 从旧链接到新文档的重定向似乎不起作用,所以我用新链接更新了我的问题。 【参考方案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”。

【讨论】:

这个答案拯救了我的一天!非常感谢!

以上是关于如何在 Swift for Realm 模型中设置主键的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Realm 中设置 NSPredicate 以找到 totalPrice > X?

如何在 Realm 中设置自动增量键?

在 Swift 中设置 CoreML 模型 - 图像分类器

如何在 swift 4 中的 UserDefalts 中设置自定义类数组数据

Swift:在 tableView Cell 中设置标签和自定义参数

如何在 Swift 中设置单元测试?