最近遇到一个 CoreData 的坑,查了半天网上没有相关的讯息,在此记录一下,警示后人。
在使用 CoreData 存储数组时,当你第一次往数组里添加对象的时候,Context 能够检测到实体的数组属性 hasChanged 从而调用 save: 函数 ,将数组存入数据库,但是当你退出当前应用,再次打开的时候改变实体的数组属性,比如新添加对象或者删除对象,Context 将检测不到数组的变化从而在存储的时候忽视数组。
也就是说,CoreData 存储数组只能在第一次改变数组的值的时候正确的进行存储,笔者试着使用mutableCopy 新创建一个数组再赋值给原数组从而改变指针,但事实证明指针的改变同样不能使Context 检测到数组的改变。(笔者查阅了 Stack Overflow 和官方文档,没有找到相关的可以改变这种情况的信息,如果读者知道的话请在评论中指出)
在使用CoreData存储数组的时候,如果需求是存储之后数组不再需要改变,那么将数组作为实体的属性是不错的选择,但是如果需求是存储之后数组需要改变的,我们就应该使用 Coredata 的relationship 功能,将原数组中的对象作为一个新的实体来进行管理,并用一个一对多的 relationship 来代替数组的功能。
值得一提的是,relationship 管理用的是 NSSet 类,这是一个无序的,并且比 NSArray 更高效的集合对象 ,但是我们项目中经常需要有序的集合类作为数据源,这时候我们可以使用
NSSet *nsset;
NSArray *sort=@[[[NSSortDescriptor alloc]initWithKey:@"property" ascending:YES]];
NSArray *array=[nsset sortedArrayUsingDescriptors:sort];
希望大家以后不要在走到这个坑里面去咯~