2014-10-01 135 views
27

我在新的iOS Swift項目中使用了Realm。我正在使用Xcode 6.0.1 iOS SDK 8.0和Realm 0.85.0如何在Swift中爲Realm模型設置主鍵

我正在嘗試使用新的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', reason: ''Foo' does not have a primary key and can not be updated

這裏是關於主鍵的文檔。我可能沒有正確設置它: 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

+0

斷開鏈接到realm.io DOC – styler1972 2015-08-17 16:54:28

+0

我們已將我們的「可可」的文檔,以「objc」當我們推出境界斯威夫特,所以請嘗試以下鏈接:https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey 我們正在設置舊鏈接的重定向,所以這不會造成未來的混亂。 – jpsim 2015-08-21 15:52:53

+0

從舊鏈接到新文檔的重定向似乎不起作用,因此我使用新鏈接更新了我的問題。 – jeffjv 2015-12-03 06:36:57

回答

64

primaryKey需求是一類函數返回的屬性的名稱是主鍵,不一個返回主鍵值的實例方法。

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

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

謝謝,是的,這些都是我的問題。另外,爲了讓它工作,我添加'覆蓋'來覆蓋聲明。 – jeffjv 2014-10-02 00:50:34

+0

我已經更新了答案,以包含Realm正確調用自定義類函數所需的「覆蓋」關鍵字 – 2014-10-09 21:06:44

+0

由於某種原因,我得到了「primaryKey()'」無效重新聲明錯誤。似乎無法弄清楚爲什麼。 – Entalpi 2015-01-17 12:00:12

6

primaryKey()返回類型可選:

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

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

感謝您的補充,看起來像接受的答案改變,以反映可選的返回類型。 – 2016-10-11 21:00:01