0
votes

I have class Country. It's a simple subclass of RLMObject. Basically when I'm saving Country then they do have regions (property of type RLMArray containing several object of type Region. Which are RLMObject subclass) but when I'm fetching it from Realm then regions are nil.

I've double check realm with browser and those data are there. Maybe I'm using wrong technique to fetch those data?

At this point I use realm-objc because I have to support devices with

Country (27 lines)

public class Country: RLMObject {
   public dynamic var name = ""
   public dynamic var desc = ""
    public dynamic var id = 0
    public var regions = RLMArray(objectClassName: Region.className())
    override public static func primaryKey() -> String? {
        return "id"
    }

    override init!() {
        super.init()
    }

    public func configure(id:Int,json:JSON){
        self.name = json["name"].stringValue
        if let desc = json["desc"].string {
            self.desc = desc
        }
        for (key:String, value:JSON) in json["regions"] {
            let region = Region()
            region.configure(key.toInt()!,json:value)
            self.regions.addObject(region)

        }
        self.id = json["id"].intValue
    }
}

CountryManager (36 lines)

public class CountryManager: NSObject {

    public func saveWines(json:JSON) {
        var countriesForStore = [Country]()
        let db = RLMRealm.defaultRealm()
        for (key:String, subJson:JSON) in json{
            let country = Country() //Serialize each country
            country.configure(key.toInt()!,json:subJson)
            countriesForStore.append(country)
        }

        db.beginWriteTransaction()
        db.addOrUpdateObjectsFromArray(countriesForStore)
        db.commitWriteTransaction()
    }

    public func regionsForCountryWithNameLike(name:String) -> RLMResults {
        let db = RLMRealm.defaultRealm()
        let countryPredicate = NSPredicate(format: "name CONTAINS[c] %@", name)
        let countries = Country.objectsWithPredicate(countryPredicate)

        var rawRegionNames = [String]()
        for country in countries {
            if let c = country as? Country {
                for region in c.regions{
                    rawRegionNames.append((region as! Region).name)
                }
            }

        }
        let regionNames = "','".join(rawRegionNames)
        let regionPredicate = NSPredicate(format: "name IN {'\(regionNames)'}")
        let regions = Region.objectsInRealm(db, withPredicate: regionPredicate)
        return regions
    }
}
1

1 Answers

1
votes

Try changing public var regions to be dynamic public var regions, since Realm requires RLMArray properties to be dynamic.