Swift - 如何在循环中将条目保存到核心数据

标签 swift core-data

我有 2 个实体:系列和季节。一个系列可以有多个季节,因此我将关系类型设置为“对很多”。 season_counter 是一个 Int 数组,包含剧集数量。

let newSeries = NSEntityDescription.insertNewObjectForEntityForName("Series", inManagedObjectContext: self.context!) as! Series

for var i = 0; i < season_counter.count; ++i{
         let newSeason = NSEntityDescription.insertNewObjectForEntityForName("Season", inManagedObjectContext: self.context!) as! Season
         newSeason.value = i+1
         newSeason.episodes = season_counter[i]
         newSeries.setValue(NSSet(object: newSeason), forKey: "seasons")

     do {
         try context?.save()
    } catch _ {
    }
}

在调试时我注意到,season_counter 存储了正确的值。当我显示结果时,我只存储了最后一季(例如 13 集,seasons.count 为 1):

do {
    let fetchRequest = NSFetchRequest(entityName: "Season")
    fetchRequest.predicate = NSPredicate(format: "series = %@", series)
    try seasons = context?.executeFetchRequest(fetchRequest) as! [Season]

    print(seasons.count)
    print(seasons[0].episodes)
} catch {
}

有什么技巧可以解决这个问题吗?

最佳答案

在每次循环中,您都会丢弃 seasons 的先前值,并将其替换为仅包含一个 season 的集合(新创建的 新赛季):

     newSeries.setValue(NSSet(object: newSeason), forKey: "seasons")

不要这样做,而是构建一组所有 newSeason 实例,然后使用该组调用 setValue:forKey: 一次。

顺便说一句,如果您创建 NSManagedObject 的子类并摆脱“键的值”业务,您的生活会更轻松。

关于Swift - 如何在循环中将条目保存到核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34187470/

相关文章:

ios - 如何使用 Magical Record 设置自动迁移核心数据堆栈?

ios - 核心数据 - 保存有关系但没有对象的实体

ios - 如何在 Swift 3 中正确放置背景音乐?

ios - 适用于 iOS 和 WatchOS 应用程序的类(class)?

ios - Objective-C 和 Swift 之间字节数组的类型转换

ios - 如何使用 Swift 在 iOS 应用程序上存储持久数据?

cocoa - NSManagedObjectContext() : `init()` was deprecated in iOS 9. 0:使用-initWithConcurrencyType

ios - 使用 swift 3 更改 iOS 中的按钮标题不起作用

ios - NSManagedObject 已删除但关系未更新

ios - 核心数据架构