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

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(新创建的newSeason)的集合:

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


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

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

10-08 04:38