父类和子类的领域过滤器

时间:2018-11-30 07:36:03

标签: ios swift realm

我想在父母和孩子上都实现过滤器,好像搜索“ chicken2”结果应该只返回以饭食作为“ chicken2” +名称为“ chicken2”的饭食的行,下面是我的带有查询和结果的模型类。

import Foundation
import RealmSwift


class Canteen: Object {
@objc dynamic var name: String?
let lines = List<Line>()

func initWithJSON(json: [String: Any]) {
    self.name = json["name"] as? String

    let lines = json["lines"] as! [[String: Any]]
    for lineJSON in lines {
        let line = Line()
        line.initWithJSON(json: lineJSON)
        self.lines.append(line)
    }

}

override static func primaryKey() -> String? {
    return "name"
}


} 


class Line: Object {
@objc dynamic var name: String?
var meals = List<Meal>()
let canteens = LinkingObjects(fromType: Canteen.self, property: "lines")

func initWithJSON(json: [String: Any]) {
    self.name = json["name"] as? String

    let meals = json["meals"] as! [[String: Any]]
    for mealJSON in meals {
        let meal = Meal()
        meal.initWithJSON(json: mealJSON)
        self.meals.append(meal)
    }
}

override static func primaryKey() -> String? {
    return "name"
}


}


class Meal: Object {
@objc dynamic var name: String?
@objc dynamic var vegan: Bool = false
let lines = LinkingObjects(fromType: Line.self, property: "meals")


func initWithJSON(json: [String: Any]) {
    self.name = json["name"] as? String
    self.vegan = json["isVegan"] as! Bool
}

override static func primaryKey() -> String? {
    return "name"
}


}

下面是我的控制器类的viewDidLoad()

    override func viewDidLoad() {
    super.viewDidLoad()



    let file = Bundle.main.path(forResource: "mealss", ofType: ".json")
    let data = try! Data(contentsOf: URL(fileURLWithPath: file!))
    let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments)

    if let dict = json as? [String: Any] {
        let canteen = Canteen()
        canteen.initWithJSON(json: dict)
        try! realm.write {
            realm.add(canteen, update: true)
        }
    }


 realm.objects(Line.self).filter("ANY meals.name contains 'chicken2'")
    print(lines.description)        
}

下面是我的打印语句的输出。

enter image description here

下面是我使用过的json文件。

{
"name": "canteen1",
"lines": [
    {
        "name": "line1",
        "meals": [
            {
                "name": "chicken2",
                "isVegan": false
            },
            {
                "name": "egges",
                "isVegan": false
            }
        ]
    },
    {
        "name": "line2",
        "meals": [
            {
                "name": "chicken",
                "isVegan": true
            },
            {
                "name": "egges",
                "isVegan": true
            }
        ]
    }
]
}

下面是我的预期输出。

[Line {
name = line1;
meals = List<Meal> <0x281301b90> (
    [0] Meal {
        name = chicken2;
        vegan = 0;
    }
);
}]

1 个答案:

答案 0 :(得分:0)

如果您像这样更改Meal类,则可以检索Meal对象并显示其父对象的名称。

class Meal: Object {
    @objc dynamic var name: String?
    @objc dynamic var vegan: Bool = false
    let lines = LinkingObjects(fromType: Line.self, property: "meals")
    var line: Line { return lines.first! } // <- added

    func initWithJSON(json: [String: Any]) {
        self.name = json["name"] as? String
        self.vegan = json["isVegan"] as! Bool
    }

    override static func primaryKey() -> String? {
        return "name"
    }

}

取回Meal对象并访问其父对象的名称,而不是Line对象。

let meals = realm.objects(Meal.self).filter("name contains 'chicken2'")
for meal in meals {
    print("name = \(meal.line.name!)")
    print(meal)
}

以下是输出:

name = line1
Meal {
    name = chicken2;
    vegan = 0;
}