简体   繁体   English

"如何在 Swift 中将 JSON 写入 Realm"

[英]How to write JSON to Realm in Swift

I can't find information how to write my JSON data to my Realm DB in Swift .我找不到如何在Swift中将我的JSON数据写入我的Realm DB的信息。

I have class:我有课:

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 = ""
}

In here I take JSON from server:在这里,我从服务器获取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
}

And how to write my data to Realm DB ?以及如何将我的数据写入Realm DB

this :这个:

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

but it is better you create a model without inherit from object :但最好创建一个没有从对象继承的模型:

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 = ""
}

then after parse json you call insertOrUpdate and map data with NewsRealm :然后在解析 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)
        })
}

for update filed .更新归档。 you should define method in newsRealm for primary key:您应该在 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"
      }
}

and then for update :然后更新:

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)            })

}

if a new filed so your object add into database but there are in database your object be update .如果一个新的文件,所以你的对象添加到数据库中,但数据库中有你的对象被更新。

sorry for my english ;)对不起我的英语;)

This code works for me, you shouldn't create class News and NewsRealm, just one:这段代码对我有用,你不应该创建类 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
           }
        }
      }
     }

Somwhere in code代码中的某个地方

    let model = News(value: jsonObject)

Using Swift 5 and RealmSwift v10.20.0使用Swift 5RealmSwift v10.20.0

Setting a primary key to your News class with this code:使用以下代码为您的 News 类设置主键:

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

You can parse and save the JSON like this way:您可以像这样解析和保存 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)")
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM