我正在使用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,并没有发现解决这个问题的任何内容)。
答案 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];