'Beginner in Realm Swift - How to instantiate a new Realm in SwiftUI

I have a class DataEntry that I want to store instances of in a Realm database, but i'm having issue instantiating a Realm. Here is my DataEntry class:

class DataEntry: Object {
    @objc dynamic var id = 0
    @objc dynamic var exercise = ""
    @objc dynamic var weightLBS = 0
    @objc dynamic var averageBarSpeed = 0
    @objc dynamic var topBarSpeed = 0

}

Some context as to what I'll be using it for: I'd like to have functions to write and delete instances of a DataEntry, but the documentation on that seems fairly simple.

  • Adding new dataEntry would be done by a user inputing data into a form
  • Deleting dataEntrys will simply be a button
  • Planning on reading the data to create graphs to track performance over time

The issue I'm having is instantiating a new Realm, and using the appropriate error handling. I've found a few simpler examples, but they all throw errors so i'm assuming there's something i'm missing. I know you're not supposed to use try!, so I'm wondering, what is a simple way to instantiate a new Realm, so I can then read/write/delete DataEntry's to the Realm Database.

This one gives me multiple "Expected Declaration" errors in lines 1 and 3.

do {
      let realm = try Realm()
    } catch let error as NSError {
      // handle error
    }

This one gives me an "Expected Declaration" error on line 1

try {
    let realm = try Realm()
    } catch {
    print(error.localizedDescription)
    }

Any additional pointers on how to best set up this would be amazing, wether or not I should have a RealmManager class that would aid in error handling. I've seen in some cases people create extensions of Realm, but this is a little too advanced for me right now.

Background in CS, but brand new to both Swift and Realm for context.

Edit/Update:

Quick clarification, I'm having issues with instantiating a Realm. Not a Realm object. I've updated above to be more clear.

To clarify my question, I'm getting errors for what appears to be good code above, so I assume I have it in the wrong place. I get errors when its inside the DataEntry class, when its inside of a view, and at the top level of a SwiftUI file. Any advice on where I should include the c ode for the instantiation would be great!



Solution 1:[1]

I am not sure if this will help but knowing where to put things within a project can sometimes help understand the flow.

So I created a realm project in XCode that writes a person object with the name of Jay to realm when button 0 is clicked. Then when button 1 is clicked, it retrieves that data and prints to console.

There's no error checking here and I am force unwrapping an optional so don't do that in a real app.

import Cocoa
import RealmSwift

class PersonClass: Object {
    @Persisted var name = ""
}

class ViewController: NSViewController {

    @IBAction func button0Action(_ sender: Any) {
        let realm = try! Realm()

        let jay = PersonClass()
        jay.name = "Jay"
        try! realm.write {
            realm.add(jay)
        }
    }

    @IBAction func button1Action(_ sender: Any) {
        let realm = try! Realm()
        let jay = realm.objects(PersonClass.self).where { $0.name == "Jay" }.first!
        print(jay.name)  //outputs "Jay" to console
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

The project starts with importing RealmSwift and then the Realm object(s) are defined outside of any other classes, so they are at a high level.

Then we have the ViewController with two button actions - as you can see, within each action function, we access realm with

let realm = try! Realm()

and then interact with realm. When that function exits, the realm object is deallocated so it's a safe way to work with Realm and not leave it 'connected'.

Some developers create a singleton or a RealmService class to interact with Realm but singletons can be tricky. I suggest initially going with the pattern shown above (and in the docs).

Solution 2:[2]

there has a better way to update and append a new record to Realm in the latest version.

@ObservedResults(Group.self) var groups
$groups.append(Group())
TextField("New name", text: $item.name)

The documentation is here, please take some time to read it. If it is hard for you, I suggest at least finishing this video by code along with her. LINK

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 G3N