42

我在一个新的 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

4

3 回答 3

90

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

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

    override class func primaryKey() -> String? {
        return "id"
    }
}
于 2014-10-02T00:09:48.373 回答
8

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

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

    override class func primaryKey() -> String? {
        return "id"
    }
}
于 2015-05-30T21:28:23.467 回答
7

对于斯威夫特 5:

import RealmSwift

     class Signature: Object {

           @objc dynamic var id = ""

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

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

于 2019-04-09T10:57:00.397 回答