Как создать и сохранить отношения один-ко-многим (Parent Child), используя tableView и Realm - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь создать отношения один-ко-многим, иначе известные как отношения родитель-потомок, в области.Я посмотрел документацию, которую предлагает область, но я все еще немного застрял в том, как сделать реальную экономию в области.У меня есть два представления, основное представление - это контроллер представления, который просто имеет табличное представление с номерами 1-7.В этом представлении я могу массово выбрать для редактирования этих строк в таблице и сохранить их в области.В этой части нет ничего сложного.

В следующем представлении у меня есть нечто очень похожее, когда есть табличное представление с некоторыми примерами данных.Есть кнопка массового выбора строк, это нормально, это кнопка сохранения, с которой у меня проблемы.Данные в этом tableView, которые одинаковы для всех из них только для целей тестирования, представляют собой данные, которые я хочу иметь дочерние отношения с данными в первом представлении.

Например, если я сохранил 4 в царстве, я щелкаю по строке с 4 на нем, и я перехожу к следующему представлению.В табличном представлении есть две строки и другие данные, но я хочу иметь возможность массового выбора этих строк и сохранения их как дочернего до 4. Я немного запутался в том, как будет выглядеть функция сохранения в области.

это мой первый контроллер вида

    import UIKit
import Realm
import RealmSwift

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    var realm: Realm!

    fileprivate var createSaves = SaveClass.createSaves()

    var testingBool = false
    var values: [String] = []
    var valuesTwo: [String] = []
    var valuesThree: [String] = []

    @IBOutlet weak var itemBtn: UIBarButtonItem!

    @IBOutlet weak var saveBtn: UIBarButtonItem!

    override func viewDidLoad() {
        super.viewDidLoad()
        print(Realm.Configuration.defaultConfiguration.fileURL!)
        realm = try! Realm()
        self.tableView.delegate = self
        self.tableView.dataSource = self
    }


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return createSaves.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
        cell.txtLbl?.text = "\(createSaves[indexPath.row].label)"
        return cell
    }


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if testingBool == true {
            values.append(createSaves[indexPath.row].label)
            valuesTwo.append(createSaves[indexPath.row].romanNum)
            valuesThree.append(createSaves[indexPath.row].txt)
        } else if testingBool == false {
            performSegue(withIdentifier: "segue", sender: indexPath)
        }
    }

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        if testingBool == true {
            if let index = values.index(of: createSaves[indexPath.row].label) {
                values.remove(at: index)
            }
            if let index = valuesTwo.index(of: createSaves[indexPath.row].romanNum) {
                valuesTwo.remove(at: index)
            }
            if let index = valuesThree.index(of: createSaves[indexPath.row].txt) {
                valuesThree.remove(at: index)
            }
        }
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let nxtVC = segue.destination as? TestingViewController
        let myIndexPath = self.tableView.indexPathForSelectedRow!
        let row = myIndexPath.row
        nxtVC?.realmedData = createSaves[row].label
    }

    @IBAction func btnPressed(_ sender: Any) {
        testingBool = !testingBool
        if testingBool == true {
            tableView.allowsMultipleSelection = true
            tableView.allowsMultipleSelectionDuringEditing = true
            itemBtn.title = "cancel"
        } else if testingBool == false {
            tableView.allowsMultipleSelection = false
            tableView.allowsMultipleSelectionDuringEditing = false
            itemBtn.title = "item"
        }

    }

    @IBAction func saveBtnPressed(_ sender: Any) {
        if testingBool == true {
            //favorite(label: values)
            realmed(label: values, romanNum: valuesTwo, txt: valuesThree)
        }
    }

    func realmed(label: [String], romanNum: [String], txt: [String]) {
        try? realm!.write {
            for (stringOne, (stringTwo, stringThree)) in zip(label, zip(romanNum, txt)) {
                let realmed = Realmed(label: stringOne, romanNum: stringTwo, txt: stringThree)
                realm.add(realmed)
            }
        }
    }


}

это мой второй вид

    import UIKit
import Realm
import RealmSwift

class TestingViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


    @IBOutlet weak var mainLbl: UILabel!

    var realm: Realm!
    var realmedData = ""
    var testingBool = false
    var values: [String] = []
    var valuesTwo: [String] = []

    @IBOutlet weak var testTable: UITableView!

    @IBOutlet weak var selectBtn: UIButton!

    @IBOutlet weak var saveBtn: UIButton!

    let firstSave = OtherSave.otherArrOne()

    override func viewDidLoad() {
        super.viewDidLoad()
        realm = try! Realm()
        self.testTable.delegate = self
        self.testTable.dataSource = self
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if objectExists(label: realmedData) == true {
            self.mainLbl.text = "\(realmedData)"
        } else {
            self.mainLbl.text = "Don't Know"
        }
    }


    @IBAction func selectBtnPressed(_ sender: Any) {
        testingBool = !testingBool
        if testingBool == true {
            testTable.allowsMultipleSelection = true
            testTable.allowsMultipleSelectionDuringEditing = true
        } else if testingBool == false {
            testTable.allowsMultipleSelection = false
            testTable.allowsMultipleSelectionDuringEditing = false
        }
    }

    @IBAction func saveBtnPressed(_ sender: Any) {
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return firstSave.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as! TestingTableViewCell
        cell.nameLbl.text = "\(firstSave[indexPath.row].name)"


        return cell
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if testingBool == true {
            values.append(firstSave[indexPath.row].info)
            valuesTwo.append(firstSave[indexPath.row].name)
        }
    }

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        if testingBool == true {
            if let index = values.index(of: firstSave[indexPath.row].info) {
                values.remove(at: index)
            }
            if let index = valuesTwo.index(of: firstSave[indexPath.row].name) {
                valuesTwo.remove(at: index)
            }
        }
    }



    func fetchingLabel(label: String) -> Realmed? {
        let realm = try? Realm()
        return realm?.object(ofType: Realmed.self, forPrimaryKey: label)
    }


    func objectExists(label: String) -> Bool {
        return realm.object(ofType: Realmed.self, forPrimaryKey: label) != nil
    }

}

это объект области родителя:

    import Foundation
import Realm
import RealmSwift

class Realmed: Object {
    @objc dynamic var label = ""
    @objc dynamic var romanNum = ""
    @objc dynamic var txt = ""
    let realmTwo = List<RealmTwo>()

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


    convenience init(label: String, romanNum: String, txt: String) {
        self.init()
        self.label = label
        self.romanNum = romanNum
        self.txt = txt
    }

}

это объект царства ребенка

    import Foundation
import UIKit
import Realm
import RealmSwift

class RealmTwo: Object {
    @objc dynamic var spanish = String()
    @objc dynamic var french = String()
    let realmed = LinkingObjects(fromType: Realmed.self, property: "realmTwo")
}

Я пытался выполнить функцию, аналогичную первым контроллерам вида:

    func realmed(label: [String], romanNum: [String], txt: [String]) {
    try? realm!.write {
        for (stringOne, (stringTwo, stringThree)) in zip(label, zip(romanNum, txt)) {
            let realmed = Realmed(label: stringOne, romanNum: stringTwo, txt: stringThree)
            realm.add(realmed)
        }
    }
}

, но я не совсем понимаю, как создатьэкземпляр данных, которые я хочу сохранить в виде массива.

Если есть что-то, с чем я могу помочь, пожалуйста, спросите Спасибо

1 Ответ

0 голосов
/ 02 декабря 2018

Я предполагаю, что вы хотите создать объекты «RealmTwo» из «значений» и «valuesTwo» и добавить их к объекту Realmed.

То, что вы хотите сделать, это

  1. Извлечение родительского объекта (Realmed)
  2. Создание дочернего объекта (RealmTwo)
  3. Добавление дочернего объекта к родительскому объекту

Это можно сделать с помощью функции, подобнойэто.

    func save() {

        let realmed = fetchingLabel(label: realmedData)! // fetch a parent
        do {
            try realm.write {
                for index in 0..<values.count {
                    let realmTwo = RealmTwo()            // create a child
                    realmTwo.french = values[index]
                    realmTwo.spanish = valuesTwo[index]
                    realmed.realmTwo.append(realmTwo)    // append
                }
            }
        } catch {
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...