J. Doe
J. Doe

Reputation: 13113

Update whole class in Realm Swift in 1 time wont work

Imagine this code:

class StoredVersions: Object{
    @objc dynamic var minimumAppVersion = 0.0
    @objc dynamic var sets = 0.0
}
class LoadViewController: UIViewController { 
    let realm = try! Realm()
override func viewDidLoad() {
    super.viewDidLoad()
    let db = Firestore.firestore()
    var newestVersions = StoredVersions()
    if let resultsStoredVersion = self.realm.objects(StoredVersions.self).first{
        print("found stored versions: \(resultsStoredVersion)")
        self.storedVersions = resultsStoredVersion
    }else{
        try! self.realm.write {
            print("no stored versions")
            self.realm.add(self.storedVersions)
        }
    }

    db.collection("data").document("version").getDocument(completion: { (data, someError) in
            if let versions = data.flatMap({StoredVersions(value: $0.data()) }) {
               try! self.realm.write {
                    self.storedVersions = versions
                }
            }
        })
}

storedVersions is updated but when I restart the application, storedVersions is back to its initial state. I do see the print "found stored versions".

If I write just 1 variable at a time, it works. That looks like this:

   try! self.realm.write {
      self.storedVersions.sets = versions.sets
    }

How can I update a whole class without having to put in variables one at a time?

Upvotes: 0

Views: 47

Answers (1)

bdash
bdash

Reputation: 18308

When you do this:

if let versions = data.flatMap({StoredVersions(value: $0.data()) }) {
    try! self.realm.write {
        self.storedVersions = versions
    }
}

You're creating a new, unmanaged StoredVersions object. You need to call realm.add(_:) to add it to the Realm, otherwise the object only exists in memory.

If you want to update the existing StoredVersions object rather than creating a new one, you should instead use Realm.add(_:update:), specifying true for the update argument. Note that this requires your type have a primary key property declared so that Realm knows which existing object to update.

Upvotes: 1

Related Questions