2014-10-01 3 views
27

Sto utilizzando Realm in un nuovo progetto iOS Swift. Sto usando Xcode 6.0.1 con iOS SDK 8.0 e Realm 0.85.0Come impostare la chiave primaria in Swift per modello Realm

Sto provando a utilizzare la nuova funzione di chiave primaria di Realm in modo da poter eseguire uno addOrUpdateObject.

Ecco un modello di esempio:

import Foundation 
import Realm 

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

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

E come sto cercando di aggiungere/aggiornare un nuovo oggetto:

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

ottengo questo errore:

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

Ecco i documenti sulla chiave primaria. Non sto probabilmente impostazione corretta: http://realm.io/docs/cocoa/0.85.0/api/Classes/RLMObject.html#//api/name/primaryKey

ultimi documenti sono qui ora: https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey

+0

link interrotto al realm.io doc – styler1972

+0

Abbiamo spostato i nostri documenti "cacao" a "objc" Quando abbiamo lanciato Reame Swift così, prova questo link: https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey Stiamo impostando i reindirizzamenti dai vecchi link, quindi questo non causare tanta confusione in futuro. – jpsim

+0

Il reindirizzamento dai vecchi collegamenti ai nuovi documenti non sembra funzionare, quindi ho aggiornato la mia domanda con il nuovo collegamento. – jeffjv

risposta

64

primaryKey deve essere una funzione di classe che restituisce il nome della proprietà, che è la chiave primaria, non un metodo di istanza che restituisce il valore della chiave primaria.

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

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

Grazie, sì questi erano i miei problemi. Inoltre, per farlo funzionare ho aggiunto "override" per sovrascrivere la dichiarazione. – jeffjv

+0

Ho aggiornato la risposta per includere la parola chiave "override" necessaria per il Realm per chiamare correttamente la funzione di classe personalizzata –

+0

Per qualche motivo ottengo un errore "redeclaration di 'primaryKey()'". Non riesco a capire perché. – Entalpi

6

Il tipo di ritorno di primaryKey() è opzionale:

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

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

Grazie per l'aggiunta di questo, sembra che la risposta accettata sia stata modificata per riflettere anche il tipo di ritorno opzionale. –