2014-10-01 10 views
27

Używam Realm w nowym projekcie Swift iOS Swift. Używam Xcode 6.0.1 z iOS SDK 8.0 i Realm 0.85.0Jak ustawić klucz podstawowy w modelu Swift for Realm

Próbuję użyć nowej funkcji klucza głównego Realm, więc mogę zrobić addOrUpdateObject.

Oto przykładowy wzór:

import Foundation 
import Realm 

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

    func primaryKey() -> Int { 
     return id 
    } 
} 

I jak próbuję dodać/zaktualizować nowy obiekt:

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() 

otrzymuję ten błąd:

RLMExecption', reason: ''Foo' does not have a primary key and can not be updated

Oto dokumenty na klucz podstawowy. Ja prawdopodobnie nie ustawiając go poprawnie: http://realm.io/docs/cocoa/0.85.0/api/Classes/RLMObject.html#//api/name/primaryKey

Najnowsze docs są tutaj teraz: https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey

+0

niedziałający link do dokumentu realm.io – styler1972

+0

Przenieśliśmy nasze "kakao" Dokumentów "objc" kiedy rozpoczęła Realm Swift, więc zamiast tego spróbuj tego linku: https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey Przygotowujemy przekierowania ze starych linków, więc to nie powodują tyle zamieszania w przyszłości. – jpsim

+0

Przekierowanie ze starych linków do nowych dokumentów nie działa, więc zaktualizowałem moje pytanie nowym łączem. – jeffjv

Odpowiedz

64

primaryKey musi być funkcją klasy, która zwraca nazwę obiektu, który jest kluczem podstawowym, nie metoda instancji, która zwraca wartość klucza podstawowego.

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

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

Dzięki, tak, to były moje problemy. Ponadto, aby działało, dodam "nadpisanie", aby zastąpić deklarację. – jeffjv

+0

Zaktualizowałem odpowiedź tak, aby zawierało słowo kluczowe "przesłonięcie" potrzebne dla dziedziny, aby poprawnie wywoływać funkcję klasy niestandardowej. –

+0

Z jakiegoś powodu otrzymuję "nieprawidłową redeclarację błędu" primaryKey() "". Nie mogę zrozumieć dlaczego. – Entalpi

6

Rodzaj powrót primaryKey() jest opcjonalny:

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

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

Dzięki za dodanie tego, wygląda na to, że zaakceptowana odpowiedź została zmieniona, aby odzwierciedlić opcjonalny typ zwrotu. –

Powiązane problemy