如何将元素添加到领域数据库

问题描述

我正在开发一个对信息进行分类的简单应用程序。现在,我只是试图收集信息,然后将其添加到领域数据库中。不幸的是,我无法弄清楚,无论我尝试哪种方法(基于教程和Realm网站),都会收到错误消息“使用未解决的标识符'realm'。 这是基于执行命令的命令按钮的代码。

@IBAction func Submit(_ sender: Any) {
    let myList = WineList()
    myList.vinyard = Vinyard.text
    myList.type = typeField.text
    myList.name = Name.text
    myList.grape = Grape.text
    myList.year = Year.text
    myList.price = Price.text
    myList.rating = rateField.text
    myList.purchased = purch
    myList.notes = Notes.text
    
    //from realm website example
    try! realm.write{
        realm.add(myList)
    }
    
    //from tutorials
    //realm.beginWrite()
    //realm.add(myList)
    //try realm.commitWrite()
}

有人可以告诉我我做错了什么吗?我将在下面发布所有代码。

    import UIKit
import RealmSwift

class RankViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource {
    
    var purch = ""

    @IBOutlet weak var typeField : UITextField!
    @IBOutlet weak var rateField : UITextField!
    
    @IBOutlet weak var Vinyard: UITextField!
    @IBOutlet weak var Name: UITextField!
    @IBOutlet weak var Grape: UITextField!
    @IBOutlet weak var Year: UITextField!
    @IBOutlet weak var Price: UITextField!
    @IBOutlet weak var Notes: UITextField!
    
    @IBAction func Purchased(_ sender: UISwitch) {
        if (sender.isOn == true){
            purch = "Yes"
        }
        else {
            purch = "No"
        }
    }
    
    let wineTypes = ["Red","White","Rose","Sparkling","Ice - Red","Ice - White","Port","Fruit","Other"]
    
    let wineRate = ["Hurray","Meh","Boo"]
    
    var typeView = UIPickerView()
    var rateView = UIPickerView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let realm = try! Realm()
        
        print (Realm.Configuration.defaultConfiguration.fileURL)
        
        typeView.delegate = self
        typeView.dataSource = self
        rateView.delegate = self
        rateView.dataSource = self
        Vinyard.delegate = self
        Name.delegate = self
        Grape.delegate = self
        Year.delegate = self
        Price.delegate = self
        Notes.delegate = self
        
        typeField.inputView = typeView
        rateField.inputView = rateView
        
    }
    
    public func numberOfComponents(in pickerView: UIPickerView) -> Int {
        if pickerView == typeView {
            // Returns for typeView
            return 1
        }
        else if pickerView == rateView {
            // Returns for rateView
            return 1
        }

        return 1
    }
        
    public func pickerView(_ pickerView: UIPickerView,numberOfRowsInComponent component: Int) -> Int {
        if pickerView == typeView {
            // Returns for typeView
            return wineTypes.count
        }
        else if pickerView == rateView {
            // Returns for rateView
            return wineRate.count
        }
        return wineRate.count
    }
        
    func pickerView(_ pickerView: UIPickerView,titleForRow row: Int,forComponent component: Int) -> String? {
        if pickerView == typeView {
            // Returns for typeView
            return wineTypes[row]
        }
        else if pickerView == rateView {
            // Returns for rateView
            return wineRate[row]
        }
            return wineRate[row]
    }

    func pickerView(_ pickerView: UIPickerView,didSelectRow row: Int,inComponent component: Int) {
        if pickerView == typeView {
            // Do stuff for typeView
            typeField.text = wineTypes[row]
            typeField.resignFirstResponder()
        }
        else if pickerView == rateView {
            // Do stuff for rateView
            typeField.text = wineRate[row]
            typeField.resignFirstResponder()
        }
    }
    
    
    @IBAction func Submit(_ sender: Any) {
        let myList = WineList()
        myList.vinyard = Vinyard.text
        myList.type = typeField.text
        myList.name = Name.text
        myList.grape = Grape.text
        myList.year = Year.text
        myList.price = Price.text
        myList.rating = rateField.text
        myList.purchased = purch
        myList.notes = Notes.text
        
        //from realm website example
        try! realm.write{
            realm.add(myList)
        }
        
        //from tutorials
        //realm.beginWrite()
        //realm.add(myList)
        //try realm.commitWrite()
    }
    
    override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) {
        Year.resignFirstResponder()
        Price.resignFirstResponder()
    }
}

extension RankViewController : UITextFieldDelegate{
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
    }

单独的文件

    import Foundation
import RealmSwift

class  WineList: Object {
    @objc dynamic var vinyard: String?
    @objc dynamic var name: String?
    @objc dynamic var grape: String?
    @objc dynamic var year: String?
    @objc dynamic var price: String?
    @objc dynamic var notes: String?
    @objc dynamic var type: String?
    @objc dynamic var rating: String?
    @objc dynamic var purchased: String?
    
}

解决方法

变量仅与创建的函数或类一起存在。因此,采用这两个功能

func getData() {
   let realm = Realm()
   let results = realm.objects...
}

func printData() {
   print(results)   //this won't work
}

如您所见,var'realm'在getData中实例化,因此var仅在该函数中可用,而在printData函数中不可用。

在您的情况下,您已在viewDidLoad中实例化了领域var

override func viewDidLoad() {
   super.viewDidLoad()
        
   let realm = try! Realm()

因此,它仅在viewDidLoad函数中可用。

要纠正您的问题,您需要在尝试使用它的函数中实例化领域

@IBAction func Submit(_ sender: Any) {
    let myList = WineList()
    ...
    
    let realm = try! Realm()

    try! realm.write{
        realm.add(myList)
    }

对此进行扩展。带上您的RankViewController类

class RankViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource {
    
    var purch = ""

看到“购买”变量?这就是所谓的“类var”,因为它是在类中的高层定义的,所以整个类都可以使用。

func printData() {
   print(self.purch)   //this will work
}

请注意,我先购买自我。当我引用它时。对我来说,这很好地表明了它是一个类var,并使代码更具可读性。但是,这不是必需的。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...