ObjC,核心数据:"不允许重复"?

Jem*_*Jem 5 core-data objective-c

我对Core Data很陌生.我的理解是它是一个对象图管理器,它与数据库不同.其中,一些功能将由程序员实现.

在编写一些在coredata框架中具有更好和更优化的对应物的逻辑之前:是否可以添加唯一键?比如entityA.name=@"jem",entityB.name=@"jem"由于名称已经被使用,未能插入entityB?

谢谢:-)嗯.

小智 10

Apple核心数据文档

核心数据是一个非常多的数据库,用于设置实体和属性的GUI只是其中的一部分.我不相信已经有拒绝非唯一键的功能,但你可以做这样的事情来在插入新实体之前运行检查:

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
BOOL unique = YES;
NSError  *error;
NSArray *items = [managedObjectContext executeFetchRequest:request error:&error];
if(items.count > 0){
    for(Person *thisPerson in items){
        if([thisItem.name isEqualToString: nameToEnter]){
             unique = NO;
        }
    }
}
if(unique){
     CartItem *thisItem = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];


     thisItem.name = nameToEnter;
     NSError *error;
     if (![self.managedObjectContext save:&error]) {
           return;
     }
}
Run Code Online (Sandbox Code Playgroud)

你应该好

  • 最好只在你的获取请求上使用NSPredicate,只获取具有该名称的对象,而不是像你在这里一样获取所有对象并迭代它们. (6认同)
  • 您还可以使用带有精确谓词的`countForFetchRequest:error`方法来返回匹配的对象数,即`== 1`(如果已存在). (4认同)