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

时间:2012-07-12 20:37:33

标签: objective-c core-data

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

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

谢谢:-) JEM。

2 个答案:

答案 0 :(得分:10)

Apple Core Data Documentation

核心数据是一个非常多的数据库,用于设置实体和属性的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;
     }
}

你应该很好

答案 1 :(得分:1)

与上面的类似,但在目标代码中作为验证方法。因此,我们将其与主要代码隔离开来:

-(BOOL)validateForInsert:(NSError **)error {
  if (![super validateForInsert:error]) {
    NSLog(@"Validate for insert FALSE: %@", *error);
    return NO;
  }

  return [self validateConsistency:error];
}

-(BOOL)validateForUpdate:(NSError **)error {
  if (![super validateForUpdate:error]) {
    NSLog(@"Validate for update FALSE: %@", *error);
    return NO;
  }

  return [self validateConsistency:error];
}


-(BOOL)validateConsistency:(NSError **)error {

  // Count number of names
  NSArray *accounts = [Account whereFormat:@"name == '%@'", self.name];
  if ([accounts count] > 1) {
    // Error!

注意:我使用了ObjectiveRecord,但我相信您知道如何计算您的记录。