【问题标题】:Error while creating realm object in swift快速创建领域对象时出错
【发布时间】:2018-03-06 00:26:33
【问题描述】:
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.
    }

}

我正在尝试创建简单的领域对象来存储和检索数据,所以首先我编写了这段代码,首先我使用了两个不同的数组来存储我的数据,但后来我使用了关联数组。但是使用关联数组我无法在表格视图中打印我的“薪水”。 所以我选择了另一个名为“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

致命错误:“试试!”表达式意外引发错误:错误 Domain=io.realm Code=10 "由于以下原因需要迁移 错误: - 属性 'Employee.salary' 已从 'int' 更改为 'string'。” UserInfo={NSLocalizedDescription=迁移是必需的,因为 以下错误: - 属性“Employee.salary”已从“int”更改为“string”。错误代码=10}:文件 /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-802.0.53/src/swift/stdlib/public/core/ErrorType.swift, 第 182 行

【问题讨论】:

标签: swift realm


【解决方案1】:

由于您更改了 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

【讨论】:

    【解决方案2】:

    看着:

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

    直接的问题似乎是自从 Realm 文件创建(保存到磁盘)以来,Realm 模型发生了变化。您需要执行Migration

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-19
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多