[_PFArray MR_deleteInContext:]:发送到实例的无法识别的选择器

时间:2013-03-10 23:09:35

标签: ios objective-c magicalrecord

我正在使用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:不兼容的指针类型分配   来自'NSArray * __ strong'的'NSMutableArray *'

我知道 findAllWithPredicate 语句将返回NSArray;但是我看过使用NSManagedObject的例子,它就是AppointmentInfo。第3行中的 ClientInfo 也是NSManagedObject,它没有编译器警告。我认为这可能是因为 find 语句只返回了一条(1)记录,但没有区别,一条记录或多条记录。

由于编译器警告我是否收到运行错误,或者是否有其他错误? (我看过Google和SO,并没有发现解决这个问题的任何内容)。

2 个答案:

答案 0 :(得分:0)

你是正确的 findAllWithPredicate:将返回一个数组。您见过的示例最有可能使用 findFirstWithPredicate:或类似的样式方法。 Find First,顾名思义,将返回请求返回的结果中的第一个对象。这很可能也是你想要的。

答案 1 :(得分:0)

我想通了......对于那些可能有同样问题的人,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];