Как написать 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)