如何在 Swift 中将 JSON 写入 Realm

Posted

技术标签:

【中文标题】如何在 Swift 中将 JSON 写入 Realm【英文标题】:How to write JSON to Realm in Swift 【发布时间】: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 之后只添加它 我的序列化是否正确? 【参考方案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)

【讨论】:

以上是关于如何在 Swift 中将 JSON 写入 Realm的主要内容,如果未能解决你的问题,请参考以下文章