如何追加/更新一对多关系的属性值

时间:2019-09-11 15:30:08

标签: swift core-data relationship

我想让CoreData参与我的项目,但是首先我需要了解它,因此我尝试启动一个简单的项目进行练习以了解其工作原理。在这里,我有一对多的关系模型,即播放列表和歌曲。

请按以下方式提问,感谢您的帮助!

  1. 现在,播放列表与Song具有一对多的关系,但是由于一首歌曲可能位于不同的播放列表中,我是否也应该将Song的播放列表属性设为多个?目前,这与Song的播放列表是一对一的关系。

  2. 播放列表的歌曲属性为NSSet类型,我如何将与播放列表01的歌曲属性相同的播放列表附加为(播放列表01,[歌曲1,歌曲2,歌曲3 ...]),但不添加播放列表实体的新行(playlist01,[song1]),(playlist02,[song2])...

  3. 如果我删除“歌曲”实体中的歌曲,是否会自动删除“播放列表”的歌曲属性中的相关歌曲?还是我需要手动实施?

enter image description here

import UIKit
import CoreData

class ViewController: UIViewController {

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        insert(playlistName: "playlist01", songName: "Love", artistName: "Tylor Swift")
        insert(playlistName: "playlist01", songName: "Just Dance", artistName: "Lady Gaga")
        insert(playlistName: "playlist02", songName: "Numb", artistName: "Linkin Park")
    }

    func insert(playlistName: String, songName: String, artistName: String) {
        let playlist = NSEntityDescription.insertNewObject(forEntityName: "Playlist", into: context) as! Playlist
        let song = NSEntityDescription.insertNewObject(forEntityName: "Song", into: context) as! Song

        song.songName = songName
        song.artistName = artistName

        playlist.name = playlistName
        playlist.addToSong(song)


        do {
            try context.save()
            print("Save OK!")
        } catch {
            fatalError("Can not save: \(error)")
        }
    }

    @IBAction func Query(_ sender: UIButton) {
        let fetchRequest = NSFetchRequest<Playlist>(entityName: "Playlist")

        do {
            let fetchObjects = try context.fetch(fetchRequest)

            for item in fetchObjects {

                print("=====================================================")
                print("Playlist name:", item.name ?? "No Playlist name")
                for songItem in item.song! {
                    var songName = (songItem as! Song).songName
                    print("song name:", songName)
                }

                // print("artist name:", item.song?.artistName ?? "No artistName")
            }
        } catch {
            fatalError("Can not query: \(error)")
        }
    }



    @IBAction func Delete(_ sender: UIButton) {
        let fetchRequest = NSFetchRequest<Playlist>(entityName: "Playlist")

        do {
            let fetchObjects = try context.fetch(fetchRequest)

            for item in fetchObjects {
                context.delete(item)
                print("Deleted")
            }
        } catch {
            fatalError("Can not delete: \(error)")
        }

    }
}

/// OutPut,是的,我知道这是不正确的,现在它只是在实体播放列表中插入了新行。我的想法是创建一个playlistPool:[String]来存储播放列表名称,然后进行比较(如果相等),然后将歌曲追加到“播放列表”中,或者在表中插入新行。

=====================================================
Playlist name: playlist01
song name: Optional("Love")
=====================================================
Playlist name: playlist01
song name: Optional("Just Dance")
=====================================================
Playlist name: playlist02
song name: Optional("Numb")

/ / /根据Joakim Danielson的评论,我更新了代码,以添加获取以获取viewDidLoad中的playlist01对象,然后向playlist01添加歌曲。

import UIKit
import CoreData

class ViewController: UIViewController {

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        insert(playlistName: "playlist01", songName: "Love", artistName: "Tylor Swift")
        insert(playlistName: "playlist01", songName: "Just Dance", artistName: "Lady Gaga")
        insert(playlistName: "playlist02", songName: "Numb", artistName: "Linkin Park")

        let fetchRequest = NSFetchRequest<Playlist>(entityName: "Playlist")
        let predicate = NSPredicate(format: "name= 'playlist01' ", "")
        fetchRequest.predicate = predicate

        let song = NSEntityDescription.insertNewObject(forEntityName: "Song", into: context) as! Song
        song.songName = "Moon"
        song.artistName = "bbb"

        do {
            let fetchObjects = try context.fetch(fetchRequest)

            for item in fetchObjects {

                item.addToSong(song)
                print("=====================================================")
                print("Playlist name:", item.name ?? "No Playlist name")
                for songItem in item.song! {
                    let songName = (songItem as! Song).songName
                    print("song name:", songName)
                }

                // print("artist name:", item.song?.artistName ?? "No artistName")
            }
        } catch {
            fatalError("Can not query: \(error)")
        }
    }

    func insert(playlistName: String, songName: String, artistName: String) {
        let playlist = NSEntityDescription.insertNewObject(forEntityName: "Playlist", into: context) as! Playlist
        let song = NSEntityDescription.insertNewObject(forEntityName: "Song", into: context) as! Song

        song.songName = songName
        song.artistName = artistName

        playlist.name = playlistName
        playlist.addToSong(song)


        do {
            try context.save()
            print("Save OK!")
        } catch {
            fatalError("Can not save: \(error)")
        }
    }

    @IBAction func Query(_ sender: UIButton) {
        let fetchRequest = NSFetchRequest<Playlist>(entityName: "Playlist")

        do {
            let fetchObjects = try context.fetch(fetchRequest)

            for item in fetchObjects {

                print("=====================================================")
                print("Playlist name:", item.name ?? "No Playlist name")
                for songItem in item.song! {
                    let songName = (songItem as! Song).songName
                    print("song name:", songName)
                }

                // print("artist name:", item.song?.artistName ?? "No artistName")
            }
        } catch {
            fatalError("Can not query: \(error)")
        }
    }



    @IBAction func Delete(_ sender: UIButton) {
        let fetchRequest = NSFetchRequest<Playlist>(entityName: "Playlist")

        do {
            let fetchObjects = try context.fetch(fetchRequest)

            for item in fetchObjects {
                context.delete(item)
                print("Deleted")
            }
        } catch {
            fatalError("Can not delete: \(error)")
        }

    }
}

/ / / /现在,输出:playlist01的属性已附加。好吧,代码很混乱,我只是想看看它是否有效。我将在我的真实项目/应用中对此进行改进:)

=====================================================
Playlist name: playlist01
song name: Optional("Moon")
song name: Optional("Love")
=====================================================
Playlist name: playlist01
song name: Optional("Just Dance")
song name: Optional("Moon")

0 个答案:

没有答案