Xcode 掌握核心数据';s唯一性约束

Xcode 掌握核心数据';s唯一性约束,xcode,core-data,unique,Xcode,Core Data,Unique,我正在macOS应用程序中使用核心数据和iTunesLibrary框架。在启动期间,我从iTunesLibrary导入信息(在iTunes曲目上) iTunes中的媒体项具有唯一标识符(即类ITLibMediaItem上的persistentId),因此在我的核心数据存储中,我将此信息用作Song实体上的唯一属性,该实体表示我模型中的iTunes曲目 我已经使用Xcode将这个属性(在我的歌曲实体上称为iTunesID)标记为唯一,并且在文本编辑器中查看原始XML(在.xcdatamodel文件

我正在macOS应用程序中使用核心数据和iTunesLibrary框架。在启动期间,我从iTunesLibrary导入信息(在iTunes曲目上)

iTunes中的媒体项具有唯一标识符(即类
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"