如何通过主键检查coredata中是否已存在NSManagedObject?

时间:2012-09-21 07:51:12

标签: object core-data exists

我使用这种方法,但不正确。

- (BOOL)checkExistByEntityName:(NSString *)entityName primaryKeyName:(NSString *)keyName primaryKey:(NSNumber *)primaryKey
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@==%@", keyName, primaryKey];

    [request setEntity:entity];
    [request setPredicate:predicate];

    NSError *error = nil;
    NSInteger count = [managedObjectContext countForFetchRequest:request error:&error];

    [request release];

     if (count > 0) {
          return YES;
    } else {
          return NO;
    }
}

1 个答案:

答案 0 :(得分:1)

Predicate programming guide是你的朋友。

  

格式字符串支持printf样式的格式参数,例如%x   (请参阅“格式化字符串对象”)。两个重要的论点是%@和   %K

     
      
  • %@是对象值的var arg替换 - 通常是字符串,   号码或日期。
  •   
  • %K是密钥路径的var arg替换。什么时候   使用%@将字符串变量替换为格式字符串   被引号括起来。如果要指定动态   属性名称,在格式字符串中使用%K,如下所示   示例
  •   
NSString *attributeName = @"firstName";
NSString *attributeValue = @"Adam";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",
        attributeName, attributeValue];

所以,只需使用

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", keyName, primaryKey];

希望有所帮助。