2014-10-01 5 views
27

Я использую Realm в новом проекте iOS Swift. Я использую 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 документ – styler1972

+0

Мы переехали наши «какао» Документы «ObjC», когда мы запустили Realm Swift, так попробуйте использовать эту ссылку: https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey Мы настраиваем перенаправления со старых ссылок, так что это не вызывают такую ​​же путаницу в будущем. – jpsim

+0

Перенаправление со старых ссылок на новые документы, похоже, не работает, поэтому я обновил свой вопрос с помощью новой ссылки. – jeffjv

ответ

64

primaryKey должна быть функция класса, которая возвращает имя свойства, которое является первичным ключом, а не метод экземпляра, который возвращает значение первичного ключа.

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

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

Спасибо, да, это были мои проблемы. Кроме того, чтобы заставить его работать, я добавляю «переопределить», чтобы переопределить объявление. – jeffjv

+0

Я обновил ответ, чтобы включить ключевое слово «переопределить», необходимое для правильного вызова пользовательской функции класса. –

+0

По какой-то причине я получаю «неверное исправление ошибки« primaryKey() »». Почему-то не получается понять. – Entalpi

6

Возвращаемый тип primaryKey() не является обязательным:

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

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

Спасибо, что добавили это, похоже, что принятый ответ изменился, чтобы отразить также возвращаемый тип. –