[_PFArray MR_deleteInContext:]: нераспознанный селектор отправлен экземпляру

Я использую MagicalRecord (MR) для удаления всех записей, принадлежащих выбранному клиенту (я успешно удаляю запись клиента, а затем перехожу к записям о встречах для этого клиента). При этом я получаю ошибку.

     [_PFArray MR_deleteInContext:]: unrecognized selector sent to instance

Вот код вместе с соответствующими определениями:

                    //  set up predicate using selectedClientKey
                NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
                NSPredicate *predicate = [NSPredicate predicateWithFormat:@"aClientKey == %@", selectedClientKey];
                ClientInfo *clientSelected = [ClientInfo MR_findFirstWithPredicate:predicate inContext:localContext];

                if(clientSelected)  {
                    [clientSelected MR_deleteInContext:localContext];
                    [localContext MR_saveToPersistentStoreAndWait];
                }

                //  delete clients appointments...
                predicate = [NSPredicate predicateWithFormat:@"aApptKey == %@", selectedClientKey];  //  use client key
                AppointmentInfo *apptSelected = [AppointmentInfo MR_findAllWithPredicate:predicate inContext:localContext];

                if(apptSelected)  {
                    [apptSelected MR_deleteInContext:localContext];
                    [localContext MR_saveToPersistentStoreAndWait];
                }

Вот определение AppointmentInfo:

@interface AppointmentInfo : NSManagedObject

@property (nonatomic, retain) NSString * aApptKey;
@property (nonatomic, retain) NSDate * aEndTime;
@property (nonatomic, retain) NSString * aServiceTech;
@property (nonatomic, retain) NSDate * aStartTime;

В инструкции findAllWithPredicate я получаю следующее предупреждение компилятора:

CalendarViewController.m:80:43: Несовместимые типы указателей, назначенные «NSMutableArray *» из «NSArray *__strong»

Я понимаю, что оператор findAllWithPredicate вернет NSArray; однако я видел примеры использования NSManagedObject, что и представляет собой AppointmentInfo. ClientInfo в 3-й строке также является NSManagedObject и не содержит предупреждений компилятора. Я подумал, что это может быть из-за того, что из оператора find была возвращена только одна (1) запись, но это не имеет значения, одна запись или несколько записей.

Я получаю ошибку запуска из-за предупреждения компилятора или что-то еще не так? (Я просмотрел Google и SO и не нашел ничего, что касалось бы этой конкретной проблемы).


person SpokaneDude    schedule 10.03.2013    source источник
comment
Вы пытаетесь вызвать MF_deleteInContext с помощью PFArray. PFArray не распознает MF_deleteInContext как метод, который он может использовать. Почему бы вам не использовать NSLog clientSelected и apptSelected, чтобы увидеть, с какими типами объектов вы на самом деле имеете дело?   -  person Hot Licks    schedule 11.03.2013


Ответы (2)


Вы правы в том, что findAllWithPredicate: вернет массив. Примеры, которые вы видели, скорее всего, используют метод findFirstWithPredicate: или аналогичный метод. Find First, как следует из названия, вернет первый объект в результатах, возвращаемых запросом. Это, скорее всего, то, что вы хотите, а также.

person casademora    schedule 11.03.2013
comment
Нет, мне нужно удалить ВСЕ встречи; когда я удаляю клиента, нет необходимости сохранять какие-либо встречи для этого клиента. - person SpokaneDude; 11.03.2013
comment
Это был не твой вопрос. Вы спросили, почему он падает. Это давало сбой, потому что вы запросили массив, а затем предположили, что это один экземпляр. - person casademora; 12.03.2013

Я понял это ... для тех, у кого может быть такая же проблема, MR_findAll возвращает NSArray, который вы должны «пройти» и удалить каждый по отдельности. Вот исправленный код сверху:

    //  delete clients appointments...
predicate = [NSPredicate predicateWithFormat:@"aApptKey == %@", selectedClientKey];  //  use client key
NSArray *apptDataArray = [AppointmentInfo MR_findAllWithPredicate:predicate inContext:localContext];

for(int i = 0; i < apptDataArray.count; i++)  {
    AppointmentInfo *ai = [apptDataArray objectAtIndex: i];
    [ai MR_deleteEntity];
}
[localContext MR_saveToPersistentStoreAndWait];
person SpokaneDude    schedule 11.03.2013
comment
Casademora: если вы посмотрите на truncate, он удалит ВСЕ объекты в таблице... если вы прочитаете мой вопрос, вы увидите, что это НЕ то, что я хотел. Пожалуйста, удалите отрицательный голос; мое решение верно именно для того, что я хотел сделать. Проблема устранена. - person SpokaneDude; 12.03.2013