NSPredicate не фильтрует результаты запроса на выборку - PullRequest
0 голосов
/ 20 августа 2011

OK. Этот заставил меня победить.

График CoreData соответствует коду, который вы видите ниже.

Я хочу отфильтровать сущности по унаследованному UUID. Я создаю предикат и запрос на выборку, используя следующий код:

NSString *aUUID = [anObjectDescription objectForKey:@"UUID"];
    NSEntityDescription *entity = [NSEntityDescription entityForName:className 
                                              inManagedObjectContext:theContext];
    //see if the entity already exists
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];
    NSLog(@"blah the uuid is %@",aUUID);
    NSLog(@"Length: %d String:[%@]", [aUUID length], aUUID);
    NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"uuid LIKE %@",aUUID];
    //NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"nonExisting==7"];

    NSLog(@"predicate is: %@",fetchPredicate);
    [request setPredicate:fetchPredicate];
    NSError *aFetchError = nil;
    NSMutableArray *foundEntities = [[theContext executeFetchRequest:request error:&aFetchError] mutableCopy];
    //if the entity already exists then ignore the create message.
    NSLog(@"found %u entities error: %@",[foundEntities count],aFetchError);
    if ([foundEntities count] == 0) {
        //create
        NSLog(@"!!!!!!!!!!!!!!!!!!!!!!creating!!!!!!!!!!!!!!!!");
        NSManagedObject *anObject = [NSEntityDescription insertNewObjectForEntityForName:className 
                                                                  inManagedObjectContext:theContext];
        Trackable *asTrackable = (Trackable*)anObject;
        asTrackable.isRemoteData = [NSNumber numberWithBool: YES];
        returnEntity = anObject;
    }
    else{
        NSLog(@"!!!!!!!!!!!!!!!!!!!!!!found!!!!!!!!!!!!!!!!");
        returnEntity = [foundEntities objectAtIndex:0];
    }

Независимо от того, с какой строкой создается предикат, я получаю все значения в таблице. Да, я пробовал "UUID LIKE% @", "UUID MATCHES% @", "UUID ==% @" и огромное количество вариантов. Все они работают одинаково. Фильтрация не производится.

Вот вывод кода, который вы видите выше. Другие изменения, которые я попробовал, не влияют на результаты, которые вы видите здесь, кроме журнала того, что представляет собой строка предиката. Там не должно быть соответствующих результатов. Я трижды проверил, что запрашиваемого объекта нет в базе данных. Он чистый, за исключением одного объекта с другим UUID.

2011-08-19 20:05:56.446 QC DBSync Example[28059:b603] working with a GameResult
2011-08-19 20:05:56.447 QC DBSync Example[28059:b603] blah the uuid is 1390FCDF-AFD1-4828-8CCC-0EBEBB741111
2011-08-19 20:05:56.447 QC DBSync Example[28059:b603] Length: 36 String:[1390FCDF-AFD1-4828-8CCC-0EBEBB741111]
2011-08-19 20:05:56.448 QC DBSync Example[28059:b603] predicate is: uuid LIKE "1390FCDF-AFD1-4828-8CCC-0EBEBB741111"
2011-08-19 20:05:56.449 QC DBSync Example[28059:b603] found 1 entities error: (null)
2011-08-19 20:05:56.449 QC DBSync Example[28059:b603] !!!!!!!!!!!!!!!!!!!!!!found!!!!!!!!!!!!!!!!

Любые идеи будут оценены. Я застрял на несколько часов.

Сообщение отредактировал yenrab 19.08.11 в 18:39

1 Ответ

0 голосов
/ 20 августа 2011

Ли,

Я всегда использую либо self.uuid, либо% K в -predicateWithFormat: как в:

p = [NSPredicate предикатWithFormat: @ "% K ==% @",@ "uuid", aUUID];

или

p = [NSPredicate ultimateateWithFormat: @ "self.uuid ==% @", aUUID];

Наслаждайтесь, Эндрю

...