2017-09-25 66 views
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. 
    } 

} 

我试图创建简单的领域对象来存储和检索数据,所以首先我写了这段代码,首先我用两个不同的数组来存储我的数据,但后来我把关联数组。但是使用关联数组我无法在表格视图中打印我的“工资”。 所以我带了另一个名为“Emp”的类并运行我的代码,但在此之后它向我显示了这个错误。在swift中创建领域对象时出错

2017-09-25 10:54:07.218441+0530 NewLogin[2264:51915] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /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] Reading from private effective user settings.

2017-09-25 10:54:18.146 NewLogin[2264:52118] Version 2.10.1 of Realm is now available: https://github.com/realm/realm-cocoa/blob/v2.10.1/CHANGELOG.md

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors: - Property 'Employee.salary' has been changed from 'int' to 'string'." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: - Property 'Employee.salary' has been changed from 'int' to 'string'., Error Code=10}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-802.0.53/src/swift/stdlib/public/core/ErrorType.swift, line 182

回答

0

由于您更改了某个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复制而来。

1

综观:

"Migration is required due to the following errors: - Property 'Employee.salary' has been changed from 'int' to 'string'."

直接问题似乎是因为境界文件创建域模型已更改(保存到磁盘)。您需要执行Migration

此外,似乎有一个较新版本的Realm可用,并且您应该考虑更新。