Xcode 掌握核心数据';s唯一性约束
我正在macOS应用程序中使用核心数据和iTunesLibrary框架。在启动期间,我从iTunesLibrary导入信息(在iTunes曲目上) iTunes中的媒体项具有唯一标识符(即类Xcode 掌握核心数据';s唯一性约束,xcode,core-data,unique,Xcode,Core Data,Unique,我正在macOS应用程序中使用核心数据和iTunesLibrary框架。在启动期间,我从iTunesLibrary导入信息(在iTunes曲目上) iTunes中的媒体项具有唯一标识符(即类ITLibMediaItem上的persistentId),因此在我的核心数据存储中,我将此信息用作Song实体上的唯一属性,该实体表示我模型中的iTunes曲目 我已经使用Xcode将这个属性(在我的歌曲实体上称为iTunesID)标记为唯一,并且在文本编辑器中查看原始XML(在.xcdatamodel文件
ITLibMediaItem
上的persistentId
),因此在我的核心数据存储中,我将此信息用作Song
实体上的唯一属性,该实体表示我模型中的iTunes曲目
我已经使用Xcode将这个属性(在我的歌曲
实体上称为iTunesID
)标记为唯一,并且在文本编辑器中查看原始XML(在.xcdatamodel文件中给出)时,我已经验证了约束是否也存在
如果我运行两次程序(导致它两次导入相同的数据),则在保存时不会发生错误,稍后我会验证存储中的元素数量是否增加了一倍。让我指出,我想要的是防止在我的存储中有表示相同信息的对象
然而,我随后进行了进一步测试,并让我的程序尝试在启动期间将两个对象(其中包含相同的信息,特别是相同的iTunesID
s)保存到我的上下文中,这里的核心数据确实抛出了一个错误,表示违反了唯一性约束
主要问题
核心数据似乎尊重将要插入的对象之间的唯一性约束,而不尊重将要插入的对象和已在存储中的对象之间的唯一性约束……这种理解正确吗
顺便说一句,我在我的NSManagedObjectContext
实例上使用默认的合并策略(errorMergePolicyType
)
附加问题
我使用iTunesPersistentID的字符串表示,因为我读到,唯一性约束只对核心数据中的字符串属性起作用;有人能拒绝/确认这一点吗
// This leads to the number of elements in my store growing, each time I run my program
for song in songsFromiTunes
{
// Create and insert a managed object into context
let managedObject = NSEntityDescription.insertNewObject(forEntityName: "Song", into: managedObjectContext) as! Song
if let artistName = song.artist?.name
{
managedObject.artist = artistName
}
managedObject.title = song.title
let iTunesIdentifier = "\(song.persistentID.int64Value)"
managedObject.iTunesID = iTunesIdentifier
if let title = song.album.title
{
managedObject.album = title
}
}
使用相同的iTunesID
插入实体两次,导致managedObjectContext
上的后续save()
引发错误
for _ in 0...1
{
let managedObject = NSEntityDescription.insertNewObject(forEntityName: "Song", into: managedObjectContext) as! Song
managedObject.artist = "Someone"
managedObject.title = "Title"
managedObject.iTunesID = "A String"
managedObject.album = "AlbumTitle"