2011-10-23 15 views
0

私はTableViewに表示するコアデータエンティティ:「モル」を持っています。私は順番にそれぞれを選択すると、私は...iPhoneコアデータ:NIBS間でエンティティを渡して取得する方法

controller.mole = [moleArray objectAtIndex:indexPath.row]; // pass the relevant mole to next NIB 

また、第2 NIBの負荷を使用して次のNIBに選ばモルを渡し、私が選択しただけで、「モル」のためだけの「詳細」を取得します。私は、次を使用しています:

NSManagedObjectContext *context = [mole managedObjectContext]; // find details for the selected mole 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Details" inManagedObjectContext:context]; 
[request setEntity:entity]; 

// now sort 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"detailsDate" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptors release]; 
[sortDescriptor release]; 

// Having created a fetch request, you now execute it. The events array needs to be mutable, so make a mutable copy of the result. 

NSError *error = nil; 
NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy]; 
if (mutableFetchResults == nil) { 

    NSLog(@"details mutableFetchResults = nil"); 

} 

// The final steps are to set the view controller’s events array instance variable and to release objects that were allocated. 

[self setDetailsArray:mutableFetchResults]; 
[mutableFetchResults release]; 
[request release]; 

トラブルは「detailsArrayは」すべてほくろの詳細を返しています。私は選択された唯一のモールの詳細を取得するように見えることはできません。私は "コンテキスト"設定が間違っていると推測します。ヘルプは高く評価しました。

答えて

2

Moleエンティティは、Detailsと多対多の関係を持っていますか?その場合、その関係をトラバースし、フェッチ要求を実行する必要はありません。このような関係があり、それがdetailsと呼ばれるとしましょう。

NSSet *details = [mole valueForKey:@"details"]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"detailsDate" ascending:NO]; 
NSArray *detailsArray = [details sortedArrayUsingSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
// [sortDescriptor release]; if you're not using ARC 

トリックは関係がNSSetオブジェクトとしてモデル化されているということですので、あなたはまだ注文した配列を取得するための値をソートする必要があります:あなたはこれを行うことができます。

+0

魅力的な作品です。ありがとうアレックス:) – Jeremy

0

あなたの問題は、あなたの詳細エンティティに対する検索をフィルタリングしていないことです。あなたは、このことができます願って、あなたがその検索をフィルタリングし、唯一のあなたがそのような

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"moleID == %@", mole.id]; 

何かをしたいモルを取得するために、次のコントローラに渡さモルのモルID(または何らかの識別子)とNSPredicateを行う必要があります。

+0

もう1つの解決策は、モールと詳細エンティティの関係がある場合は、モールから詳細管理オブジェクトだけを取得することです。 NSManagedObject * detail = mole.detailのような新しいコントローラでは、それが1-1の関係であると仮定すると、1-N関係を持つことは少し変わる可能性があります。 –

+0

こんにちは。これは1対多の関係、すなわち、1モルのオブジェクトがn個の詳細オブジェクトを有することができる。どうにかして特定の塊のすべての詳細オブジェクトを取得したい – Jeremy

+0

次に、あなたはちょうど下に言った人のようにNSSetを使ってそれを行うことができます:NSSet * details = [mole valueForKey:@ "details"]; NSSetメソッドを使用してNSArrayまたは必要なものを取得することができます。 –

0

Mole管理オブジェクトが既に手元にある場合は、関連するDetailオブジェクトを見つけるためにフェッチする必要はありません。代わりにあなたはただの関係を歩いています。

あなたは、このようなデータモデルに何か持っているようですね:

Mole{ 
    //.. some attributes 
    details<-->>Detail.mole 
} 

Detail{ 
    //... some attributes 
    mole<<-->Mole.details 
} 

カスタムNSManagedObjectのサブクラスを持っている場合は、あなただけのそれに関連する詳細情報のセットを取得するaMole.detailsを使用します。

NSSet *details=aMoleObj.details; 
をあなただけの一般的なNSManagedObjectsを使用している場合

、あなたが使用します。

NSSet *details=[aMoleObj valueForKey:@"details"]; 

フェッチは、関係のないオブジェクトを見つけるためのものです。関連するオブジェクトがすでにある場合は、関係を照会するだけです。

+0

こんにちはTechZen。モールと詳細は別々のエンティティであり、それは1対多の関係、すなわち各モルにn個の詳細です。その場合、それはNSSetの詳細=モルですか?再度、感謝します。 – Jeremy

関連する問題