【问题标题】:How to write JSON to Realm in Swift如何在 Swift 中将 JSON 写入 Realm
【发布时间】:2016-10-10 05:15:54
【问题描述】:

我在Swift 中找不到如何将我的JSON 数据写入我的Realm DB 的信息。

我有课:

class News: Object {
    dynamic var newsID: String = ""
    dynamic var newsTitle: String = ""
    dynamic var newsFullText: String = ""
    dynamic var newsAutor: String = ""
    dynamic var newsCommentCount: String = ""
    dynamic var newsSeenCount: String = ""
    dynamic var newsDate: String = ""
    dynamic var newsCategory: String = ""
}

在这里,我从服务器获取JSON

func parseJSONData(data: NSData) -> [News] {

    do {
        let temp: NSString = NSString(data: data, encoding: NSUTF8StringEncoding)!
        let myNSData = temp.dataUsingEncoding(NSUTF8StringEncoding)!

        let jsonResult = try NSJSONSerialization.JSONObjectWithData(myNSData, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
        let jsonNews = jsonResult["posts"] as! [AnyObject]
        for jsonnewes in jsonNews {
            let newsJson = News()
            newsJson.newsTitle = jsonnewes["post_title"] as! String
            newsJson.newsAutor = jsonnewes["author_name"] as! String
            newsJson.newsFullText = jsonnewes["full_text"] as! String
            newsJson.newsID = jsonnewes["id"] as! String
            newsJson.newsCategory = jsonnewes["menu_category_name"] as! String
            newsJson.newsDate = jsonnewes["create_date"] as! String
            newsJson.newsSeenCount = jsonnewes["review"] as! String
            newsJson.newsCommentCount = jsonnewes["comment_count"] as! String
            newsItems.append(newsJson)
        }
    } catch {
        print(error)
    }
    return newsItems
}

以及如何将我的数据写入Realm DB

【问题讨论】:

  • 你读过docs吗?将对象写入领域数据库非常容易
  • 当然可以。我知道我可以通过尝试来写作! realm.write { 让 json = 试试吧! JSONSerialization.jsonObject(with: data, options: []) realm.create(City.self, value: json, update: true) } 但这对我没有帮助
  • 在一个数组中收集你的newsJson(比如newsObjects),然后调用realm.add(newsObjects)将它们全部添加到Realm。
  • @Zhan 创建News 数组后,您可以遍历它并执行realm.add(news),这意味着在您的parseJSONData 之后只添加它
  • 我的序列化是否正确?

标签: ios json swift xcode realm


【解决方案1】:

这个:

func insertOrUpdate(news: News) {
    try! realm.write({
            realm.add(news)
        })
}

但最好创建一个不从对象继承的模型:

class News {
   var newsID: String = ""
   var newsTitle: String = ""
   var newsFullText: String = ""
   var newsAutor: String = ""
   var newsCommentCount: String = ""
   var newsSeenCount: String = ""
   var newsDate: String = ""
   var newsCategory: String = ""
}



class NewsRealm: Object {
    dynamic var newsID: String = ""
    dynamic var newsTitle: String = ""
    dynamic var newsFullText: String = ""
    dynamic var newsAutor: String = ""
    dynamic var newsCommentCount: String = ""
    dynamic var newsSeenCount: String = ""
    dynamic var newsDate: String = ""
    dynamic var newsCategory: String = ""
}

然后在解析 json 之后调用 insertOrUpdate 并使用 NewsRealm 映射数据:

func insertOrUpdate(news: News) {
    let realm = try! Realm()
    try! realm.write({
        let newsRealm = NewsRealm()
        newsRealm.newsTitle = news.newsTitle
        newsRealm.newsAutor = news.newsAutor
        newsRealm.newsFullText = news.newsFullText
        .
        .
        .
        realm.add(newsRealm)
        })
}

【讨论】:

    【解决方案2】:

    用于更新归档。您应该在 newsRealm 中为主键定义方法:

    class NewsRealm: Object {
        dynamic var newsID: String = ""
        dynamic var newsTitle: String = ""
        dynamic var newsFullText: String = ""
        dynamic var newsAutor: String = ""
        dynamic var newsCommentCount: String = ""
        dynamic var newsSeenCount: String = ""
        dynamic var newsDate: String = ""
        dynamic var newsCategory: String = ""
    
          override static func primaryKey() -> String? {
            return "newsID"
          }
    }
    

    然后进行更新:

    func insertOrUpdate(news: News) {
        let realm = try! Realm()
        try! realm.write({
            let newsRealm = NewsRealm()
            newsRealm.newsTitle = news.newsTitle
            newsRealm.newsAutor = news.newsAutor
            newsRealm.newsFullText = news.newsFullText
            .
            .
            .
            realm.add(newsRealm, update: true)            })
    
    }
    

    如果一个新的文件,所以你的对象添加到数据库中,但数据库中有你的对象被更新。

    对不起我的英语;)

    【讨论】:

    • 此答案与您的其他答案有何不同?你推荐哪一个?
    【解决方案3】:

    这段代码对我有用,你不应该创建类 News 和 NewsRealm,只有一个:

      import SwiftyJSON
    
        class News: Object {
           @objc dynamic var newsID: String?
           @objc dynamic var newsTitle: String?
    
         convenience init(value: JSON) {
           self.init()
           for (key, value) in value {
              switch key {
               case "newsID":
                  self.newsID = value.stringValue
               case "newsTitle":
                  self.newsTitle = value.stringValue
               }
            }
          }
         }
    

    代码中的某处

        let model = News(value: jsonObject)
    

    【讨论】:

      【解决方案4】:

      使用 Swift 5RealmSwift v10.20.0

      尝试使用以下代码为您的 News 类设置主键:

      override static func primaryKey() -> String? {
          return "newsID"
      }
      

      然后你可以这样解析并保存JSON:

      do {
          try! realm.write {
              let json = try! JSONSerialization.jsonObject(with: jsonData, options: [])
              realm.create(News.self, value: json, update: .modified)
          }
      } catch {
          print("ERROR: \(error.localizedDescription)")
      }
      

      或者,如果你的类没有主键,你可以这样编码:

          realm.create(News.self, value: json, update: .error)
      

      【讨论】:

        猜你喜欢
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-31
        • 2020-05-11
        • 1970-01-01
        相关资源
        最近更新 更多