如何保存多个对象,为领域中的每个项目创建不同的行

时间:2018-11-30 03:16:37

标签: ios swift realm

我想做的是能够一次保存并在一个tableview中放置多个对象。我有一个带有简单标签的简单表格视图,其中有一个可以将其发送到编辑模式的条形按钮。在编辑模式下,我希望能够将在编辑模式下选择的所有对象保存到领域中。

我认为它并没有保存一个对象数组那么多,因为当我尝试所有操作时,都是在Realm中创建一个空行。

这是我的主要viewController:

import UIKit
import Realm
import RealmSwift

class ViewController: UIViewController, UITableViewDelegate,



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

let num = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"]
var testingBool = false
var values: [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 num.count
}

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


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if testingBool == true {
        values.append(num[indexPath.row])
    }
}

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

@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)
    }
}

func favorite(label: [String]) {
    let saveTest = SaveTest()
    try? realm!.write {
        for string in num {
            realm.add(saveTest)
        }
    }
}
}

这是领域模型:

import Foundation
import RealmSwift
import Realm

class SaveTest: Object {

@objc dynamic var label = ""

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

我想要发生的是用我选择的多行填充Realm。 例如,如果我选择4和5的行,我想将它们同时保存到领域中,但是它们是领域中的不同对象,那么它将创建2行,其中一行为4,另一行为五。

我要这样做的原因也是将来将来能够将多个选定对象保存到具有多列的数据库中。如果在这个假设中我有四列:id,Number,Written和Roman,我想将每一行的数据保存到这个新的领域数据库中。

例如,如果我再次选择4和5,它将在领域中创建2个新行,其中一行具有“ 4”,“ Four”和IV,其中每一列都有id,而另一行具有每列中包含“ 5”,“五个” V和ID。

我希望我不要太含糊和令人困惑。如果我能以任何方式提供帮助,请询问。 谢谢


更新:

通过遍历堆栈溢出并在koropok的帮助下,我弄清楚了如何一次保存多个数组。我发现当您想一次遍历多个数组时使用zip()。

这是我拥有的新领域保存功能。顺便说一句,它有自己的对应领域类。

    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 :(得分:1)

您需要使用循环内而不是循环内的标签来初始化SaveTest对象。

[root@blah01 bin]# ./version.sh 
Using CATALINA_BASE:   /opt/apache-tomcat-7.0.69 
Using CATALINA_HOME:   /opt/apache-tomcat-7.0.69 
Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.69/temp 
Using JRE_HOME:        /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el6_10.x86_64/jre 
Using CLASSPATH:       /opt/apache-tomcat-7.0.69/bin/bootstrap.jar:/opt/apache-tomcat-7.0.69/bin/tomcat-juli.jar 
Server version: Apache Tomcat/7.0.64 
Server built:   Aug 19 2015 17:18:06 UTC 
Server number:  7.0.64.0 
OS Name:Linux 
OS Version:     2.6.32-754.3.5.el6.x86_64 
Architecture:   amd64 
JVM Version:    1.8.0_181-b13 
JVM Vendor:     Oracle Corporation