Cor Brink
Cor Brink

Reputation: 79

Realm queries to extract data

I have 2 Realm Models:

class CourseModel: Object {
    dynamic var coursename = ""
    dynamic var par3field = 0
    dynamic var par4field = 0
    dynamic var par5field = 0

    let scoreModels: List<ScoresModel> = List<ScoresModel>()
    override internal static func primaryKey() -> String? { return "coursename" }
}

class ScoresModel: Object {
    dynamic var dateplayed = ""

    var courseModel: CourseModel? {
        return linkingObjects(CourseModel.self, forProperty: "scoreModels").first
    }
}

The app user will first add a new course for which I use CourseModel. As the user plays a course they enter scores for that course, for which I use ScoresModel, hence the primary key 'coursename'.

I query the CourseModel with

let realm = try Realm()
let results = realm.objects(CourseModel)
return results

and it produces the following result

Results<CourseModel> (
    [0] CourseModel {
        coursename = First Course;
        par3field = 4;
        par4field = 10;
        par5field = 4;
        scoreModels = RLMArray <0x797a36d0> (
            [0] ScoresModel {
                dateplayed = Apr 5, 2016; },
            [1] ScoresModel {
                dateplayed = Mar 3, 2016; }
        );
    },
    [1] CourseModel {
        coursename = Second Course;
        par3field = 4;
        par4field = 10;
        par5field = 4;
        scoreModels = RLMArray <0x7a046f40> (
            [0] ScoresModel {
                dateplayed = Apr 5, 2016; }
        );
    }
)

The ScoresModel produces a similar result but without the CourseModel data. The ScoresModel has a lot of data in it, I only showed 'dateplayed' here to keep it short.

My question is this; when I've extracted the data from Realm how can I access a particular field to work with that data, i.e. how do I get the par5field data to do calculations with it, and also the 2nd question how do I get to the scoreModels data, for example 'dateplayed' to list the dates in a table for example?

Upvotes: 0

Views: 1643

Answers (1)

TiM
TiM

Reputation: 15991

When you perform a query against Realm, the results are returned in a Results object that behaves exactly like an array. So you need to iterate through each object to access the properties you want for each one.

To answer your first question, to access the par5field property (From just the first object):

let firstObject? = results.first
let par5field = firstObject.par5field
// Do calculations with it

For your second question, scoreModels is just a standard array object, so you can just insert the values it into a table view as you would a standard Array object.

If you wanted to list ALL of the ScoreModel objects, regardless of which CourseModel objects they belong to, you can perform a Realm query to get them directly.

let realm = try! Realm()
let results = realm.objects(ScoreModel)
return results

Upvotes: 1

Related Questions