0

下面是我的查找或创建代码:

+ (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];
}

请忽略这样一个事实,即我没有通过两个 return 语句来采用最佳实践——我会在将我的代码推送到生产之前这样做

它通过传递一个 NSManagedObject 实体来工作entityName,并且有一个 NSPredicate 来检查是否有一个entityIDKeywith 值entityIDValueentityIDKey = entityIDValue. 我也尝试过使用==.

无论我使用哪种比较方法,该if ( [array count] )方法都不会被命中,因此第二NSLog条语句总是得到输出,说明我知道存在于我的 Core Data 存储中的对象实际上并不存在。因此,当我去显示我的商店的内容时,我最终会得到许多重复的条目。

我的 NSPredicate 语句是否正确?

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

在哪里entityIDKey = @"userID"entityIDvalue = @"1234567890"

谢谢!

4

1 回答 1

0

是的,问题肯定是谓词。

谓词参数应该是:

%K == %@

不是

%@ = %@

于 2012-05-25T18:14:04.157 回答