【问题标题】:how to implement json in realm swift如何在领域swift中实现json
【发布时间】:2019-08-01 06:06:07
【问题描述】:

我有一本 json 格式的字典。我想在我的应用程序(大约 1000 个单元格)中显示它,并将其保存到领域数据库。我是数据库新手,谁能告诉我如何实现这个?我应该尝试在应用外转换格式还是在使用时加载json?

我的字典是这样的..

[  
   {  
      "id":0,
      "book":1,
      "lesson":1,
      "kanji":"\u4e2d\u56fd\u4eba"
   }   {  
      "id":1,
      "book":1,
      "lesson":1,
      "kanji":"\u65e5\u672c\u4eba"
   },
   ...
]

【问题讨论】:

  • 请张贴一些你的字典结构。
  • 解析 JSON 并提取密钥以相应地制作领域模型。领域文档也很容易理解,我建议深入研究它。
  • 这看起来只是一个基本字典,每个子字典都有键:值对。因此,创建一个具有 4 个属性Realm Model 的 Realm 对象,将子 Dictionary(id、book、course、kanji)传递给 Realm 对象(通过 init 或函数)以填充它的属性并将其保存到 Realm。还有什么吗?

标签: swift realm


【解决方案1】:

首先,您需要安装 2 个 pod:

pod 'SwiftyJSON' #great for handling JSON
pod 'RealmSwift' #Realm database

您需要创建能够保存在 Realm 中的对象。我想你的对象当然是某种类型或类似的东西。您可以根据需要重命名它:

import Foundation
import RealmSwift
import SwiftyJSON

class Course: Object {

   @objc dynamic var id = 0
   @objc dynamic var book = 0
   @objc dynamic var lesson = 0
   @objc dynamic var kanji = ""

   override static func primaryKey() -> String? { //you need this in case you will want to update this object in Realm
      return "id"
   }

   convenience init(courseJson: JSON) {

      self.id = courseJson["id"].intValue
      self.book = courseJson["book"].intValue
      self.lesson = courseJson["lesson"].intValue
      self.kanji = courseJson["kanji"].stringValue
   }    
}

现在,在您从服务器获取 json 的地方,您需要这样做:

var courses = [Course]()
let jsonArray = JSON(dataFromServer).arrayValue
for courseJson in jsonArray {
   let course = Course(courseJson: courseJson)
   courses.append(course)
}

//Now, you need to save these objects in Realm:

let realm = try! Realm()
try! realm.write {
    realm.add(courses, update: true)
} 

在要显示数据的视图控制器的 viewDidLoad 方法中,您需要从 Realm 获取所有 Course 对象,将它们添加到数组中并在 tableView/collectionView 中显示数据:

import UIKit
import RealmSwift

class PresentingCoursesVC: UIViewController {

   //MARK: IBOutlets
   @IBOutlet weak var tableView: UITableView!

   //MARK: Properties
   var courses = Results<Course>?

   //MARK: Lifecycles
   override func viewDidLoad() {
      super.viewDidLoad()

      getCourses()
   }

   //MARK: Private functions
   private func getCourses() {
      let realm = try! Realm()
      courses = realm.objects(Course.self).sorted(byKeyPath: "id", ascending: true)
      tableView.reloadData()
   }
}

//MARK: TableView Datasource
extension PresentingCoursesVC: UITableViewDataSource {

   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

      return courses?.count ?? 0
   }

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

      let cell = tableView.dequeueReusableCell(withIdentifier: "MyCustomCell") as! MyCustomCell
      let course = courses[indexPath.row]
      cell.setupCell(course: course)
      return cell
   }
}

希望我的回答对你有帮助!

【讨论】:

    【解决方案2】:
    class Book: Object {
      @objc dynamic var id = 0
      @objc dynamic var book = 0
      @objc dynamic var lesson = 0
      @objc dynamic var kanji = ""
    }
    
    class MyDic: Object {
        var yourKeyOfDic = List<Book>()
    }
    

    现在将您的 dic 与 MyDic 类对象映射,然后通过以下代码将该对象添加到领域中,

    let realm = try! Realm()
    try! realm.write {
      realm.add(yourDicObject)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多