How to properly handle creation and update for realm.io relationships

I have two RLMObjects:

class Timeline: RLMObject {

    dynamic var entries = RLMArray(objectClassName: Entry.className())
    dynamic var id          = 0
    dynamic var title       = ""
    dynamic var coverPhoto  = ""
    dynamic var body        = ""

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

class Entry: RLMObject {


    dynamic var id          :Int = 0
    dynamic var timelineID  :Int = 0
    dynamic var name        :String = ""
    dynamic var caption     :String = ""
    dynamic var body        :String = ""
    dynamic var imageURL    :String = ""

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

As you can see, there is a To-Many relationship between the timeline and the record. The timeline has many entries.

selecting and assigning JSON to my graphs works very well, they are retrieved and installed using:

realm.beginWriteTransaction()
Timeline.createOrUpdateInDefaultRealmWithObject(timelineObject)
realm.commitWriteTransaction()

My problem arises when I try to get the records (which are a separate JSON request / response) for a given timeline and set them.

Getting and creating them like this works great:

realm.beginWriteTransaction()
Entry.createOrUpdateInDefaultRealmWithObject(entryObject)
realm.commitWriteTransaction()

But of course, this does not bind them to my Timeline object. So, I tried to get my Timeline object, and then adding an Entry object to my timeline by doing the following:

let timelineObject = Timeline(forPrimaryKey: id)
timelineObject.entries.addObject(entryObject) 

(inside ofc transaction).

. , RLMException:

'RLMException', reason: 'Can't set primary key property 'id' to existing value 59.'

- , ? , RLMObject, , ?

segiddins, : createOrUpdate... ( timelineObject.entries.addObject(entryReturn).

let realm = RLMRealm.defaultRealm()                        
realm.beginWriteTransaction()

for entry in json["entries"] {

...
//Process and map the JSON
...
let entryReturn = Entry.createOrUpdateInDefaultRealmWithObject(entryObject)
timelineObject.entries.addObject(entryReturn)

}
realm.commitWriteTransaction()
+4
1

Entry, createOrUpdate.

+5

All Articles