如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将文件写入位于 Apple Files App 中的文件夹

如何在 Swift 中将文件写入位于 Apple 文件应用程序的文件夹中

如何在 Swift 中将 Realm 对象转换为 JSON?

如何在 Swift 中将数组添加到我的 JSON 字典

如何在swift中将json数组保存和检索到用户默认值?

如何在 Swift 中将 JSON 数据保存到 UserDefault? [复制]