如何在 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 5 和 RealmSwift 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 文件应用程序的文件夹中