Как написать JSON в Realm в Swift

Я не могу найти информацию, как написать свой JSON данные к моему Realm DB в Swift,

У меня урок:

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?

4 ответа

Решение

Этот:

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

Для обновления подано. Вы должны определить метод в 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)            })

}

если новый файл подан, ваш объект будет добавлен в базу данных, но в базе данных ваш объект будет обновлен.

Извините за мой английский;)

Этот код работает для меня, вам не нужно создавать классы 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)

Использование Swift 5 и RealmSwift v10.20.0

Попробуйте установить первичный ключ для вашего класса новостей с помощью этого кода:

      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)
Другие вопросы по тегам