首页 文章

在swift中创建领域对象时出错

提问于
浏览
0
import UIKit
import Realm
import RealmSwift

class Employee: Object {
    dynamic var name = ""
    dynamic var salary = 0
}
class Emp: Object{
    dynamic var name = ""
    dynamic var salary = ""
}

class RealMEx: UIViewController,UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var txt1: UITextField!
    @IBOutlet weak var txt2: UITextField!

    @IBOutlet weak var tblView: UITableView!

    var dataArry = [[String: Any]]()

    @IBAction func Submit(_ sender: UIButton) {
        let emp = Employee()
        emp.name = txt1.text!
        emp.salary = Int(txt2.text!)!

        let realm = try! Realm()

        try! realm.write {
            realm.deleteAll()
            realm.add(emp)
        }

        let data = realm.objects(Employee.self)

        for i in Array(data){
            let d = ["name":i["name"]!,"salary": i["salary"]!]
            dataArry.append(d as [String : Any])
        }
        print (Array(data))
        tblView.reloadData()
    }   

    override func viewDidLoad() {
        super.viewDidLoad()
        tblView.delegate = self
        tblView.dataSource = self
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)as! RealMTableCell
        cell.lbl.text = dataArry[indexPath.row]["name"] as? String
        cell.sallbl.text = dataArry[indexPath.row]["salary"] as? String
        return cell
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

我正在尝试创建简单的realm对象来存储和检索数据,所以我首先编写了这段代码,首先我使用了两个不同的数组来存储我的数据,但后来我为此采用了关联数组 . 但是使用关联数组我不能在表视图中打印我的“薪水” . 所以我拿了另一个名为“Emp”的类并运行我的代码,但之后它显示了我的错误 .

2017-09-25 10:54:07.218441 0530 NewLogin [2264:51915] [MC] systemgroup.com.apple.configurationprofiles路径的系统组容器是/ Users / admin / Library / Developer / CoreSimulator / Devices / 9F794470-A0F6 -4D8F-8A4C-9CBF6852EE71 / data / Containers / Shared / SystemGroup / systemgroup.com.apple.configurationprofiles 2017-09-25 10:54:07.239924 0530 NewLogin [2264:51915] [MC]从私人有效用户设置读取 . 2017-09-25 10:54:18.146 NewLogin [2264:52118] Realm版本2.10.1现已推出:https://github.com/realm/realm-cocoa/blob/v2.10.1/CHANGELOG.md致命错误:'试试!'表达式意外地引发了错误:Error Domain = io.realm Code = 10“由于以下错误,需要迁移: - 属性'Employee.salary'已从'int'更改为'string' . ” UserInfo = {NSLocalizedDescription =由于以下错误而需要迁移: - 属性'Employee.salary'已从'int'更改为'string' . ,错误代码= 10}:file /Library/Caches/com.apple . xbs / Sources / swiftlang / swiftlang-802.0.53 / src / swift / stdlib / public / core / ErrorType.swift,第182行

2 回答

  • 1

    看着:

    “由于以下错误,需要迁移: - 属性'Employee.salary'已从'int'更改为'string' . ”

    最直接的问题似乎是Realm模型自创建Realm文件(保存到磁盘)后发生了变化 . 你需要执行Migration .

    此外,似乎有更新版本的Realm可用,您应该考虑更新 .

  • 0

    您需要定义迁移块并执行迁移,因为您已更改了某个Realm模型类 . 您实际上不需要在迁移块中执行任何操作,Realm可以自行处理迁移,您只需要将架构版本增加1 .

    AppDelegate.swift 中,定义 didFinishLaunchingWithOptions 函数内的迁移:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        let config = Realm.Configuration(
            // Set the new schema version. This must be greater than the previously used
            // version (if you've never set a schema version before, the version is 0).
            schemaVersion: 1,
            // Set the block which will be called automatically when opening a Realm with
            // a schema version lower than the one set above
            migrationBlock: { migration, oldSchemaVersion in
                // We haven’t migrated anything yet, so oldSchemaVersion == 0
                if (oldSchemaVersion < 1) {
                    // Nothing to do!
                    // Realm will automatically detect new properties and removed properties
                    // And will update the schema on disk automatically
                }
        })
    
        // Tell Realm to use this new configuration object for the default Realm
        Realm.Configuration.defaultConfiguration = config
    
        // Now that we've told Realm how to handle the schema change, opening the file
        // will automatically perform the migration
        let realm = try! Realm()
        return true
    }
    

    代码是从Realm的official documentation复制的 .

相关问题