2010-07-22 2 views
3

У меня есть следующий код на месте:NSPredicate - Не работает, как ожидалось

NSString *mapIDx = @"98"; 
    NSLog(@"map id: %@", mapIDx); 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"WayPoint" inManagedObjectContext:managedObjectContext]; 
    [request setEntity:entity]; 

    //NSPredicate *predicate = [NSPredicate predicateWithFormat:@"waypoint_map_id=%@", mapIDx]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"waypoint_map_id==%@", mapIDx]; 
    [request setPredicate:predicate]; 

    NSError *error; 
    listArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
    [request release]; 


    int arrayItemQuantity = [listArray count]; 
    NSLog(@"Array Quantity: %d", arrayItemQuantity); 

    // Loop through the array and display the contents. 
    int i; 
    for (i = 0; i < arrayItemQuantity; i++) 
    { 
     NSLog (@"Element %i = %@", i, [listArray objectAtIndex: i]); 
    } 

    /* 
    NSInteger *xCoordinate = listArray[1]; 
    NSInteger *yCoordinate = listArray[3]; 
    NSLog(@"xCoordinate: %@", xCoordinate); 
    NSLog(@"yCoordinate: %@", yCoordinate); 

    CLLocationCoordinate2D coordinate = {xCoordinate, yCoordinate}; 
    MapPin *pin = [[MapPin alloc]initwithCoordinates:coordinate]; 
    [self.mapView addAnnotation:pin]; 
    [pin release]; 
    */ 

    [listArray release]; 

Как вы можете видеть, что я пытаюсь выбрать конкретные объекты из моей базы данных, что-нибудь с waypoint_map_id 98, но NSPredicate не работает, как я и ожидал. Нулевые объекты выбираются.

У вас есть мысли?

ответ

6

Предикат с форматом не скрывает строку «98» до номера. Вместо этого это

waypoint_map_id == "98" 

... который ищет атрибут строки. Измените предикат:

NSInteger mapIdx=98; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"waypoint_map_id==%d", mapIDx]; 

... который возвращает предикат:

waypoint_map_id == 98 
+0

thanks, waypoint_map_id - это строка в базе данных. – Stephen

+0

О, тогда вы уверены, что у вас есть объект WayPoint? С атрибутом 'waypoint_map_id' из« 98 »? Вы можете попробовать прокомментировать предикат и сбросить все объекты WapPoint для проверки. – TechZen

+0

Кроме того, код с комментариями выглядит странно. Первый и третий элементы в возвращаемом массиве будут «WayPoint» NSManagedObjects (или подкласс). Поскольку у вас нет дескриптора сортировки, назначенного на выборку, они будут в случайном порядке. Затем вы назначаете свои адреса в качестве указателей на целые числа, а затем пытаетесь использовать эти адреса как двойные в определении координат. Это не сработает. Я думаю, что вы можете что-то смутить о своих объектах. – TechZen

2

Предполагая, что вы определенно имеете этот объект в своей базе данных, попробуйте добавить котировки вокруг значения?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"waypoint_map_id==\"%@\"", mapIDx]; 

(хватаясь за соломинку!)

Вашего prediacte выглядит хорошо, так что я бы немедленно начать подозревать, что ошибка где-то еще:

  • Есть definintely путевой с этим идентификатором?
  • Является ли listArray nil i.e, что-то еще пошло не так с запросом?

Вы не можете проверить, что это за ошибка - возможно, это даст вам больше информации?

NSError *error = nil; 
NSArray *results = [managedObjectContext executeFetchRequest:request error:&error]; 
[request release]; 

if (nil == results || nil != error) 
    NSLog(@"Error getting results : %@", error); 

listArray = [results mutableCopy]; 

Надеюсь, что это вообще полезно!

+0

спасибо, я положил в ошибке кода проверки и повторно , не получая никаких ошибок. Есть определенные путевые точки с этим id, когда я запускаю без предиката, я могу видеть вывод в консоли. – Stephen

+0

Что вы получите, если вы запустите его без prediacte и выведите __NSLog (@ "% @", item.waypoint_map_id); __ для каждого элемента в спискеArray? – deanWombourne

+0

следующая строка: NSLog (@ "Элемент% i =% @", i, [[listArray objectAtIndex: i] valueForKey: @ "waypoint_map_id"]); выходы «Элемент 1813 = 98» на консоль. – Stephen

1

проблема решена:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"waypoint_map_id contains[cd] %@", mapIDx]; 
    [request setPredicate:predicate]; 
Смежные вопросы