适当的NSPredicate核心数据中的查找或创建模式

时间:2012-05-25 16:36:57

标签: objective-c ios core-data nspredicate replace

以下是 find-or-create 代码:

+ (id)checkIfEntity:(NSString *)entityName 
        withIDValue:(NSString *)entityIDValue 
           forIDKey:(NSString *)entityIDKey 
    existsInContext:(NSManagedObjectContext *)context
{

    // Create fetch request
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setReturnsObjectsAsFaults:NO];

    // Fetch messages data
    NSEntityDescription *description = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
    [request setEntity:description];

    // Only include objects that exist (i.e. entityIDKey and entityIDValue's must exist)
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@=%@", entityIDKey, entityIDValue];
    [request setPredicate:predicate];    

    // Execute request that returns array of dashboardEntrys
    NSArray *array = [context executeFetchRequest:request error:nil];

    if ( [array count] ) {

        NSLog(@"%@ = %@ DOES EXIST", entityIDKey, entityIDValue);
        return [array objectAtIndex:0];
    }

    NSLog(@"%@ = %@ DOES NOT EXIST", entityIDKey, entityIDValue);
    return [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
}

请忽略这样一个事实,即我没有采用最佳做法,只有两个返回语句 - 我会在将代码推送到生产之前将其用作

它通过传递带有entityName的NSManagedObject实体来工作,并且具有NSPredicate,用于检查entityIDKey是否具有值entityIDValue; entityIDKey = entityIDValue。我也试过使用==

无论我使用哪种比较方法,都不会命中if ( [array count] )方法,因此第二个NSLog语句总是会输出,描述我知道的核心数据存储中存在的对象不存在实际存在。因此,当我去显示我的商店的内容时,我最终得到了许多重复的条目。

我的NSPredicate声明是否正确?

    `NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@=%@", entityIDKey, entityIDValue];`

其中entityIDKey = @"userID"entityIDvalue = @"1234567890"

谢谢!

1 个答案:

答案 0 :(得分:0)

是的,问题绝对是谓词。

谓词参数应该是:

%K == %@

%@ = %@