必须先说我是初学者程序员,原谅任何其他明显的错误。使用包含两个对象的简单数据库,A Show对象及其对应的剧集,从json请求中获取谁的详细信息。
在显示持久节目的视图中,我写了一个函数,在按下按钮时触发,其中json文件被检查为new&或显示剧集列表属性中不存在的剧集。我在下面写的函数导致无法添加具有现有主键的对象。 (暂不记得我头顶的确切名字)
我已经完成了一项测试,我从持久化的节目中删除了一些剧集,并启动了最初将节目保存到数据库的方法,并且出于某种原因实现了我想要的功能,即只添加已删除的剧集而不会发生任何崩溃或添加重复项。
此时不确定是否有任何其他动作。非常感谢提前。
AppDelegate中的领域常量
let database = try! realm()
领域对象模型
Class Show: Object {
dynamic var title: String? = nil
var episodes = List<Episode>()
class func showWithData (JSONShowObject) -> Show? {
let showTobeSaved = Show()
showTobeSaved.title = JSONShowObject.title
for episode in JSONShowObject.episodeArray {
let episodeToBeSaved = Episode.episodeWithData(episode)
showTobeSaved.episodes.append(episodeToBeSaved!)
}
return showToBeSaved
}
override static func primaryKey() -> String? {
return "title"
}
}
class Episode: Object {
dynamic var title: String? = nil
class func episodeWithData (JSONEpisodeObject) -> Episode? {
let episodeToBeSaved = Episode()
episodeToBeSaved.title = JSONEpisodeObject.title
return episodeToBeSaved
}
override static func primaryKey() -> String? {
return "title"
}
}
向Realm数据库添加show的功能
func saveShowToDatabase(JSONShowObject) {
try! database.write() {
database.add(Show.showWithData(JSONShowObject), update: true)
}
}
查看持续展示的控制器
class ShowVC: UIViewController {
var shows: Results<Show>!
override func viewDidLoad() {
super.viewDidLoad()
shows = database.objects(Show.self)
}
@IBAction func updateShowEpisodes(_ sender: UIButton) {
updateEpisodesForStoredShows(showsInDatabase: shows)
}
func updateEpisodesForStoredShows (showsInDatabase: Results<Show>!) {
for showToUpdate in showsInDatabase {
for episodeToBeSaved in JSONShowObject.episodeArray {
try! database.write() {
showToUpdate.episodes.append(episodeToBeSaved)
}
}
}
}
}
问题回答后添加的代码
//Added To Show Model
func updateShowEpisodes() -> Show ? {
for episode in JSONShowObject.episode) {
if let episodeToBeSaved = database.object(ofType: Show.self, forPrimaryKey: episode.title) {
self.episodes.append(episodeToBeSaved)
} else {
self.episodes.append(Episode.episodeWithData(episode))
}
}
return self
}
//Changed Func in VC For Persisted Shows
func updateEpisodesForStoredShows(showsInDatabase: Results<Show>!) {
for showToUpdate in showsInDatabase {
try! database.write {
database.add(showToUpdate.updateEpisodeFeed()!, update: true)
}
}
}
答案 0 :(得分:0)
将一个对象追加到一个领域List
计为将该对象的新副本“添加”到数据库中。如果数据库中已存在具有相同主键的另一个对象;这将抛出异常。有必要查询以前存在的特定对象,而不是使用相同的主键创建新对象(这是您的JSON解析器正在执行的操作)。
使用Realm().object(ofType:forPrimaryKey:)
方法可以轻松检查具有特定主键的对象是否已存在。在这种情况下,使用该方法首先查询具有该键的对象是否存在更合适,如果存在,则使用该方法而不是JSON生成的对象。
另外,我还建议您使主键值更加独特。过去肯定会出现过不同节目的相同名称的实例(例如“太空堡垒卡拉狄加”),以及来自不同系列的同名剧集(其中很多通常都有一个名为'Pilot'的剧集在那里。): ))。
让JSON为每个节目/剧集发送唯一的主键值是最好的,但您也可以使用JSON信息来“构建”一个更独特的主键字符串。