我想让CoreData参与我的项目,但是首先我需要了解它,因此我尝试启动一个简单的项目进行练习以了解其工作原理。在这里,我有一对多的关系模型,即播放列表和歌曲。
请按以下方式提问,感谢您的帮助!
现在,播放列表与Song具有一对多的关系,但是由于一首歌曲可能位于不同的播放列表中,我是否也应该将Song的播放列表属性设为多个?目前,这与Song的播放列表是一对一的关系。
播放列表的歌曲属性为NSSet类型,我如何将与播放列表01的歌曲属性相同的播放列表附加为(播放列表01,[歌曲1,歌曲2,歌曲3 ...]),但不添加播放列表实体的新行(playlist01,[song1]),(playlist02,[song2])...
如果我删除“歌曲”实体中的歌曲,是否会自动删除“播放列表”的歌曲属性中的相关歌曲?还是我需要手动实施?
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")