5

DeliveryオブジェクトのセットがCustomer関連付けられているというオブジェクトがあります。各Deliveryオブジェクトには、mainCustomerIdであるaも格納されNSNumber*ます。のデータソースを管理するために使用されるNSFetchedResultsControllerがありますUITableViewcustomers問題は、NSFetchedResultsControllerをCustomerのlastNameフィールド(顧客はオブジェクトで呼び出される多対多の関係に格納されます)で並べ替えたいということですDelivery。ここで、セット内の顧客の1つはDeliveryのMainCustomerIdと等しいcustomerIdを持っています。

配信クラスは次のようになります(関連する部分のみ)

@interface Delivery : NSManagedObject
@property (nonatomic, retain) NSNumber * mainCustomerId;
@property (nonatomic, retain) NSSet *customers;
@end

カスタマークラスは次のようになります

@interface Customer : NSManagedObject
@property (nonatomic, retain) NSNumber * customerId;
@property (nonatomic, retain) NSString * lastName;
// And the inverse relationship to the deliveries
@property (nonatomic, retain) NSSet *deliveries;
@end

このようなことを行うNSSortDescriptorを作成する必要があります(注:これは間違った形式であり、機能しないことを知っています。ただし、アイデアが伝わることを願っています)

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"customers.AnyobjectInSet.lastName WHERE AnyobjectInSet.customerId == masterCustomerId ascending:YES];

サブクエリとNSExpressionsを使用していくつかのことを試しましたが、Cocoaを使用する機能(@selectorでの並べ替えなど)を使用できないため、Cocoa処理なしで実際のmysqlクエリを生成できる必要があるため、常に不足しています。データ。しかし、これはmysqlでの簡単なクエリであるため、何らかの方法でこれを行う必要があるように感じます。

select * from Delivery JOIN Customer ON Customer.customerId=Delivery.mainCustomerId ORDER BY Customer.lastName;

結果がフェッチされた後に並べ替える必要がなく、並べ替え順序をオブジェクトに保存しようとしています(これは簡単ですが、関連するデータを選択しているため、間違った解決策だと思います。方法が必要です。並べ替える)。どんな助けでも大歓迎です。

前もって感謝します。

4

1 に答える 1

2

わかりましたので、何かが足りないかもしれませんが、述語の提案は私にとって完全に理にかなっています。私が間違っている場合は修正してください(mainCustomerIDを知っていると仮定して):

NSNumber *mainCustomerID = ...

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"customerID == %@", mainCustomerID];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES];

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Customer"];
[request setPredicate:predicate];
[request setSortDescriptors:@[ sortDescriptor ]];

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request ...

したがって、基本的に明確でない場合、これは customerID が mainCustomerID と等しいすべての Customer レコードを取得し、それらの結果を lastName で並べ替えます。これにより、これを実行するための SQL ステートメントが内部的に生成されます。

これはあなたがやろうとしていることではありませんか?

また、実行時に CoreData によって生成される SQL を確認したい場合 (便利なデバッグ ツール)、スキームを開き、[引数] タブに移動して、[起動時に渡される引数] に次を追加します。

-com.apple.CoreData.SQLDebug 1

ハッピーコーディング:)

于 2013-04-23T16:03:15.277 に答える