Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set primary key in Swift for Realm model

Tags:

ios

swift

realm

I'm using Realm in a new iOS Swift project. I'm using Xcode 6.0.1 with iOS SDK 8.0 and Realm 0.85.0

I'm trying to use the new Realm primary key feature so I can do an addOrUpdateObject.

Here is a sample model:

import Foundation import Realm  class Foo: RLMObject {     dynamic var id = 0     dynamic var title = ""      func primaryKey() -> Int {         return id     } } 

And how I'm trying to add/update a new object:

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

I get this error:

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

Here are the docs on the primary key. I'm probably not setting it correctly: http://realm.io/docs/cocoa/0.85.0/api/Classes/RLMObject.html#//api/name/primaryKey

Latest docs are here now: https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey

like image 864
jeffjv Avatar asked Oct 01 '14 23:10

jeffjv


People also ask

How to set primary key in Realm android?

Enabling them is very easy. Firstly, you add a property to your Realm model class that you would like to use as a primary key. After that, for Cocoa you simply override the 'primaryKey()' class method of the Realm Object to declare to Realm that this is your designated primary key.

Does realm work with SwiftUI?

Realm objects have bindings to SwiftUI controls and, much like toggling the bought property, they already start a realm transaction to write the changes in the database whenever you change those values.


1 Answers

primaryKey needs to be a class function which returns the name of the property which is the primary key, not an instance method which returns the value of the primary key.

@objcMembers class Foo: RLMObject {     dynamic var id = 0     dynamic var title = ""      override class func primaryKey() -> String? {         return "id"     } } 
like image 78
Thomas Goyne Avatar answered Sep 28 '22 02:09

Thomas Goyne