почему эта работа NSP предиката? - PullRequest
0 голосов
/ 14 июня 2011

У меня есть список объектов, управляемых CoreData. Я хочу получить конкретный объект из CoreData, используя NSPredicate. ниже код, который я использую. Array arr всегда возвращается с 0 объектами, вероятно, потому что выборка не может найти объект, который соответствует предикату. я точно знаю, что по крайней мере 1 объект в CoreData имеет объявление. uuid, которое соответствует adUdid. я вручную получил весь список объектов и сам искал uuid и нашел его. реклама является участником WebServiceAuthService_mobileAdvertisingVO, а uuid является участником рекламы. Еще более агрегирующим является тот факт, что этот точный код прекрасно работает в другом проекте. Я не могу понять, почему этот код больше не работает в новом проекте.

если это важно, этот код находится в статической библиотеке, которую я создаю.

РЕДАКТИРОВАТЬ: arr всегда пуст, поэтому нет ничего для публикации. также нет ошибок. это просто не работает. uuids - это NSStrings что-то вроде "9ca98efe-ef48-47c0-aff5-058224b3093d". У меня есть ощущение, что проблема может быть в другом месте кода и просто проявляется здесь.

WebServiceAuthService_mobileAdvertisementVO *mobileAd = nil;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"WebServiceAuthService_mobileAdvertisementVO" inManagedObjectContext:managedObjectContext];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"advertisement.uuid == %@",adUdid];

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

NSError *error = nil; 
NSArray *arr = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];

if (error) 
{
    DLog(@"fetched special ad error: %@",[error localizedDescription]);
}

if (arr && [arr count] >= 1) 
{
    DLog(@"found ad with UUID %@",adUdid);
    for (WebServiceAuthService_mobileAdvertisementVO *obj in arr) 
    {
        NSManagedObjectID *objID = [obj objectID];
        if (![objID isTemporaryID]) 
        {
            mobileAd = obj;
        }
    }
}

1 Ответ

0 голосов
/ 14 июня 2011

Вы сравниваете строки, и в этом случае LIKE является лучшим оператором, чем ==. Итак:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"advertisement.uuid LIKE %@",adUdid];

Не беспокойтесь о кавычках, ПредикатWithFormat: автоматически поместит одинарные кавычки вокруг правого термина

EDIT: Справка: Руководство по программированию предиката

...