Почему это утверждение «если» не работает?

Я пытаюсь определить, есть ли у меня повторяющаяся запись в CoreData, используя MagicalRecord. Для этого я сравниваю обновленные данные с первой существующей записью:

Это код, который я использую для поиска:

    //  set up predicate to find single appointment
if(selectedApptKey.length > 0)  {
    NSPredicate *predicate =  ([NSPredicate predicateWithFormat:
                                @"((aApptKey == %@) && (aStartTime == %@) && (aEndTime == %@) && (aServiceTech == %@))",
                                selectedApptKey, tStartDate, tEndDate, tStaff]);
    NSLog(@"\n\nselectedApptKey: %@\ntStartDate: %@\ntEndDate: %@\ntStaff: %@",selectedApptKey, tStartDate, tEndDate, tStaff);

    ai = [AppointmentInfo MR_findFirstWithPredicate:predicate inContext:localContext];

    if((ai.aApptKey == selectedApptKey) &&
       (ai.aStartTime == tStartDate) &&
       (ai.aEndTime == tEndDate) &&
       (ai.aServiceTech == tStaff))  {

        updateFlag = YES;
    }
}

Это данные предиката, которые я использую для поиска существующей записи:

selectedApptKey: RolfMarsh3911 tStartDate: 2013-12-29 20:15:00 +0000 tEndDate: 2013-12-29 22:15:00 +0000 tStaff: Kellie

Это результирующая запись, полученная из приведенного выше кода:

Printing description of ai:
<NSManagedObject: 0xb705430> (entity: AppointmentInfo; id: 0xb7bca00        <x-coredata://649CD00C-3C88-4447-AA2B-60B792E3B25F/AppointmentInfo/p22> ; data: {
aApptKey = RolfMarsh3911;
aEndTime = "2013-12-29 22:15:00 +0000";
aImage = nil;
aNotes = "";
aPosH = 200;
aPosW = 214;
aPosX = 0;
aPosY = 231;
aServiceTech = Kellie;
aServices = "";
aStartTime = "2013-12-29 20:15:00 +0000";
client = nil;
})

Как видите, данные записи и поиска точны. Вопрос: почему оператор if терпит неудачу (для updateFlag не установлено значение YES)?


person SpokaneDude    schedule 29.12.2013    source источник
comment
== и указатели... Классическая ошибка. Вы проверяете, равны ли указатели, а не указанное значение.   -  person Larme    schedule 30.12.2013
comment
Можете ли вы дать мне пример кода, каким должно быть if? Я не вижу, что не так...   -  person SpokaneDude    schedule 30.12.2013
comment
Используйте isEqualToDate для NSDate, isEqualToString для NSString и т. д. Мы не знаем, какого типа ваши переменные, поэтому...   -  person Larme    schedule 30.12.2013
comment
Ааа ... да, я помню, как использовал это ... не могли бы вы повторить свой комментарий в качестве ответа?   -  person SpokaneDude    schedule 30.12.2013


Ответы (1)


Вам нужно использовать isEqualToString: вместо ==, так как вы хотите сравнить фактические значения объекта, а не указатели. Предполагая, что это все строки. Если у вас есть объекты даты, используйте isEqualToDate:.

== всегда сравнивает указатели, которые в данном случае не равны, так как указывают на разные объекты.

person Josiah    schedule 29.12.2013