1

CoreDataiPhoneアプリケーションを作成しようとしています。私が追跡しているエンティティの1つは車であり、各車の1つの属性は「メーカー」です。

私のアプリケーションの「車の編集」セクションには、以前にシステムに入力された固有のメーカーのそれぞれをロードする必要があるUIPickerViewがあります。私がやろうとしているのは、NSFetchRequestを作成して、一意の「manufacturer」属性の配列を取得し、それを使用してUIPickerViewにデータを入力することです。

私が遭遇している問題は、データストアにゼロレコードまたは100レコードがあるかどうかに関係なく、要素0で実行されたフェッチリクエストに値@""のレコードが常に1つあることです。

私はこれを間違ってやっていますか、それともこれを行う簡単な方法がありますか?簡単なSQLクエリを実行できたらいいのにと思います!!!

私のコードは以下の通りです:

// Populate the manufacturerNameList array
NSManagedObjectContext *moc = [self.selectedLease managedObjectContext];
NSEntityDescription *ed = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:moc];
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[fetchRequest setEntity:ed];

// Get only manufacturer and only uniques
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"manufacturer",nil]];
[fetchRequest setReturnsDistinctResults:YES];

// Sort by manufacturer in ascending order
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"manufacturer" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error = nil;
self.manufacturerNameList = [moc executeFetchRequest:fetchRequest error:&error];
if (error) {
     // Handle the error
}

NSLog(@"The count of self.propertyNameList is %i",[self.propertyNameList count]);

ありがとう!

4

3 に答える 3

2

manufacturerNameListCarメーカー名ではなく、エンティティの配列になります。また、属性名だけでなくNSArrayNSPropertyDescriptionオブジェクトのを渡す必要があります。setPropertiesToFetch

プロパティを設定する方法は次のとおりです。

NSDictionary *entityProperties = [ed propertiesByName];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"manufacturer"], nil]];

からの結果はエンティティの になるため、ループなどで属性値を抽出する必要がありexecuteFetchRequest:ます。NSArrayCarmanufacturer

Manufacturerエンティティが参照するエンティティを作成することを検討することCarをお勧めします。これにより、現在試みている方法でより多くのクエリを実行できるようになります。

于 2010-01-20T22:29:23.010 に答える
1

もう1つのアプローチは、メーカーのエンティティを作成し、車とメーカーの間に関係を持たせて、車に1つのメーカーがあり、メーカーに多くの車があるようにすることです。

車<<->メーカー

Manufacturerエンティティは、その「名前」という文字列属性を持つことができます。

次に、すべてのManufacturerオブジェクトをフェッチし、「name」プロパティを確認することで、製造元名の完全なリストを取得できます。

于 2010-01-20T22:30:27.190 に答える
0

最も簡単な説明は、空のメーカーの値を持つ車のエンティティがあることです。述語がフェッチをソートすると、空白文字列が最初にランク付けされます。

全体をログに記録し、self.propertyNameList実際に何が返されているかを確認します。

于 2010-01-20T22:28:04.653 に答える