附加到持久领域对象的列表属性?

时间:2016-10-05 05:49:01

标签: swift realm

必须先说我是初学者程序员,原谅任何其他明显的错误。使用包含两个对象的简单数据库,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)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

将一个对象追加到一个领域List计为将该对象的新副本“添加”到数据库中。如果数据库中已存在具有相同主键的另一个对象;这将抛出异常。有必要查询以前存在的特定对象,而不是使用相同的主键创建新对象(这是您的JSON解析器正在执行的操作)。

使用Realm().object(ofType:forPrimaryKey:)方法可以轻松检查具有特定主键的对象是否已存在。在这种情况下,使用该方法首先查询具有该键的对象是否存在更合适,如果存在,则使用该方法而不是JSON生成的对象。

另外,我还建议您使主键值更加独特。过去肯定会出现过不同节目的相同名称的实例(例如“太空堡垒卡拉狄加”),以及来自不同系列的同名剧集(其中很多通常都有一个名为'Pilot'的剧集在那里。): ))。

让JSON为每个节目/剧集发送唯一的主键值是最好的,但您也可以使用JSON信息来“构建”一个更独特的主键字符串。