Как установить первичный ключ в модели Swift для Realm

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


person jeffjv    schedule 01.10.2014    source источник
comment
неработающая ссылка на документ realm.io   -  person tango whiskey double    schedule 17.08.2015
comment
Мы переместили наши документы какао в objc при запуске Realm Swift, поэтому попробуйте вместо этого использовать эту ссылку: realm.io/docs/objc/latest/api/Classes/RLMObject.html # // api / name / Мы настраиваем переадресацию со старых ссылок так что это не вызовет такой путаницы в будущем.   -  person jpsim    schedule 21.08.2015
comment
Перенаправление со старых ссылок на новые документы, похоже, не работает, поэтому я обновил свой вопрос, добавив новую ссылку.   -  person jeffjv    schedule 03.12.2015


Ответы (3)


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

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

    override class func primaryKey() -> String? {
        return "id"
    }
}
person Thomas Goyne    schedule 02.10.2014
comment
Спасибо, да, это были мои проблемы. Кроме того, чтобы заставить его работать, я добавляю «переопределение», чтобы переопределить объявление. - person jeffjv; 02.10.2014
comment
Я обновил ответ, включив в него ключевое слово override, необходимое для правильного вызова функции пользовательского класса в Realm. - person Glen Selle; 10.10.2014
comment
По какой-то причине я получаю неверное повторное объявление ошибки primaryKey (). Кажется, не могу понять почему. - person Entalpi; 17.01.2015
comment
@Entalpi Я обновил документы realm.io/docs/cocoa/0.89.2 / # customizing-models, ошибки по-прежнему возникают? Не стесняйтесь отправлять сообщения на groups.google.com/forum/#!forum/realm -cocoa, если да, с образцом вашего кода - person yoshyosh; 20.01.2015
comment
Согласно @CherryKuczery, возвращаемый тип не является обязательным. Если бы у меня было достаточно репутации, я бы просто объединил два ответа. - person clozach; 28.03.2016

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

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

    override class func primaryKey() -> String? {
        return "id"
    }
}
person CherryKuczery    schedule 30.05.2015
comment
Спасибо за добавление, похоже, что принятый ответ был изменен, чтобы отразить и дополнительный тип возвращаемого значения. - person Ethan Parker; 12.10.2016

Для Swift 5:

import RealmSwift

     class Signature: Object {

           @objc dynamic var id = ""

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

Чтобы избежать: Завершение работы приложения из-за неперехваченного исключения «RLMException», причина: «Свойство первичного ключа« id »не существует для объекта.

person Maria Ortega    schedule 09.04.2019
comment
Этот ответ спас мне день! Большое спасибо! - person dcg; 12.05.2021