0

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を返すことを理解しています。ただし、AppointmentInfoであるNSManagedObjectを使用した例を見てきました。 3行目のClientInfoもNSManagedObjectであり、コンパイラの警告はありません。findステートメントから返されたレコードが1つしかないためかもしれないと思いましたが 、1つのレコードでも、複数のレコードでも違いはありません。

コンパイラの警告が原因で実行エラーが発生しますか、それとも他に何か問題がありますか?(私はGoogleとSOを調べましたが、この特定の問題に対処するものは何も見つかりませんでした)。

4

2 に答える 2

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];
于 2013-03-11T15:58:03.567 に答える
0

findAllWithPredicate:が配列を返すことは正しいです。これまでに見た例は、 findFirstWithPredicate:または同様のスタイル メソッドを使用している可能性が最も高いです。Find First は、名前が示すように、リクエストから返された結果の最初のオブジェクトを返します。これは、おそらくあなたが望むものでもあります。

于 2013-03-11T08:58:25.827 に答える