我有一个允许用户保存收藏夹的应用程序。我正在使用Core Data将收藏夹存储为托管对象。我已经编写了一些代码来防止存储重复的可能性,但我想知道是否有更好的方法来做到这一点。每个收藏夹对象都有一个唯一的ID字段。在下面的代码中,我只是简单地循环并检查ID字段,如果该值已经存在,设置标志值为真,跳出循环。
-(BOOL)addFavorite{
BOOL entityExists = NO;
if(context){
// does this favorite already exist?
NSArray *allFaves = [AppDataAccess getAllFavorites];
for(Favorite *f in allFaves){
if([f.stationIdentifier isEqualToString:stID]){
entityExists = YES;
break;
}
}
if(!entityExists){
NSError *err = nil;
Favorite *fave = [Favorite insertInManagedObjectContext:context];
fave.stationRealName = riverGauge.name;
fave.stationIdentifier = stID;
fave.stationState = @"WV";
if(![context save:&err]){
NSLog(@"ERROR: Could not save context--%@", err);
}
return YES;
}
return NO;
}
我想知道Core Data是否有能力检查正在添加的对象是否是重复的。有没有 predicate 可以处理重复检查?谢谢!
6条答案
按热度按时间lymgl2op1#
CoreData本身不做唯一化,它没有两个条目相同的概念。
要启用这样的行为,您必须通过执行“插入前搜索”(又名“创建前获取”)来自己实现它。
请记住,这假定单线程访问
izj3ouym2#
只要是iOS 9.0之后的更新,您就可以通过模型中的“唯一约束”轻松完成。但请注意-如果您的商店已经包含重复数据,则在应用发布时,核心数据将无法进行任何自动迁移。
例如,请参见此处-core data unique constraints
zyfwsgd63#
雨燕4
frebpwbc4#
雨燕3:
nhjlsmyf5#
我想知道Core Data是否有能力检查正在添加的对象是否是重复的。
不,核心数据不关心这个。
是否有一个 predicate 可以处理重复检查?
由于对象具有唯一的ID,可以由您控制,因此可以获取具有该ID的现有收藏夹。
如果您得到任何结果,您就知 prop 有该ID的收藏夹已经存在。并且,如果您想更改它,您可以引用该收藏夹。
如果只有几个收藏夹,您当前的方法是很好的,而且可能更快。执行获取将更好地扩展到许多收藏夹。
lb3vh1jj6#
如果你要处理多个记录,那么遍历一个计数获取或者检索实际的对象在CPU上是非常昂贵的。在我的例子中,我对所有匹配的记录做了一次获取,但是要求返回一个只包含UUID字符串的字典。这节省了大量的CPU开销。
例如,我在核心数据中的每条记录上都有一个UUID属性,在CloudKit中有一个对应的UUID列为@“UUID”。
字典的控制台日志看起来像这样。只需要匹配最少的信息:
More here at the developer site表示查找唯一值。