Фильтр областей для родительских и дочерних классов - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу реализовать фильтр как для родительского, так и для дочернего элементов, так как если результат поиска '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 () класса моего контроллера *) 1004 *

    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 голосов
/ 30 ноября 2018

Вы можете извлечь объект 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"
    }

}

Вместо объектов Line извлекайте объекты Meal и получайте доступ к имени их родительского объекта.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...