1

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

- (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;
    }
}
4

1 回答 1

1

谓词编程指南是您的朋友。

格式字符串支持 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];

希望有帮助。

于 2012-09-21T15:56:43.760 回答