0

Objective-C では、コア データを使用してエンティティを取得していましたが、それらは NSArray として返されました。あまりにも頻繁にフェッチしていて、エンティティの戻り値を利用できることに気付きました。たとえば、Customer エンティティには多くの Invoices があり、Invoices には多くの ItemSolds があります。ここに私が使用しているいくつかのコードがあります:

NSError *error = nil;
// fetch all customers
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Customer"
                                           inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
self.fetchedCustomers = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedCustomers == nil) {
    NSLog(@"ERROR");
}
[fetchRequest release];
// end of customer fetch

これは単純なフェッチ リクエストで、fetchedCustomers は NSArray プロパティとして設定されます。次に、その関数を使用します。

self.fetchedInvoices = [[customerToView valueForKey:@"invoices"] allObjects];

これは機能し、請求書番号と日付をテーブルに適切に表示できます。ただし、次に使用します:

self.fetchedObjects = [[fetchedInvoices valueForKey:@"itemsSold"] allObjects];

後で、合計を追加しようとすると、次のようにします。

 double price = [[[fetchedObjects objectAtIndex:i] valueForKey:@"Price"] doubleValue];

そして、次のエラーが表示されます。

-[__NSCFSet doubleValue]: unrecognized selector sent to instance 0x10228f730

ここに NSSet が関係しているのはなぜですか? 述語を使用して請求書とアイテムをフェッチした場合、問題はありませんでしたが、非常に非効率的でした。私はむしろここで何がうまくいかないのかを理解したいと思っています。どんな助けでも感謝します、ありがとう。

追加情報:

関心のある分野:

@interface Invoice : NSManagedObject {
@private
}
@property (nonatomic, retain) NSSet *itemsSold;
@end

@interface Invoice (CoreDataGeneratedAccessors)

- (void)addItemsSoldObject:(ItemSold *)value;
- (void)removeItemsSoldObject:(ItemSold *)value;
- (void)addItemsSold:(NSSet *)values;
- (void)removeItemsSold:(NSSet *)values;

@end
4

3 に答える 3

0

これを試してみてください:

NSString *className = NSStringFromClass([[[fetchedObjects objectAtIndex:i] valueForKey:@"Price"] class]);
NSLog(@"class name: %@", className);

どのタイプを取得するかを確認します。

于 2012-05-27T17:03:59.980 に答える
0

[fetchedObjects objectAtIndex:i] ここでは NSSet のようです。[[fetchedObjects objectAtIndex:i] valueForKey:@"Price"] は、キー "Price" を持つすべてのオブジェクトを取得します。これは NSSet です。幸運を!

于 2012-05-27T17:23:05.527 に答える
0

私は自分の間違いに気づきました。fetchedCustomers を特定の「customerToView」に分類していました。私は fetchedInvoices で同じことをしませんでした。追加するための私の解決策:

NSManagedObject *invoiceToView = [fetchedInvoices objectAtIndex:(int)[invoicesTable selectedRow]];

そして、fetchedInvoices の代わりにinvoiceToView を使用します。

私の愚かな間違いです!

于 2012-05-27T17:27:55.580 に答える