10

完全に機能するコアデータモデルがありますが、フェッチリクエストを使用してデータを返すと、一見ランダムな順序になっています。このデータを並べ替える最良の方法は何ですか?コアデータモデルで別のテーブルを使用し、最初に「クエリ」を使用するのですか?それとも、データを配列にプルダウンして、そのように並べ替えることでしょうか?

私はこれらのいずれかをどのように行うのかよくわかりません。それが私がこの質問をしている理由です。

4

1 に答える 1

36

あなたの質問は非常に一般的ですが、私はあなたにいくつかのヒントを与えることを試みます。

クラスを使用する場合NSFetchRequest、ソート記述子を指定できます。

Apple docから:

返されるオブジェクトの順序を指定するソート記述子(のインスタンスNSSortDescriptor)の配列。たとえば、姓、名の順に指定します。

ここでは、 CoreDataSnippetsドキュメント内に簡単な例を見つけることができます

NSManagedObjectContext *context = <#Get the context#>;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>"
    inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>"
    ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    // Handle the error
}

// release allocated objects if you don't use ARC

どこ

<#Entity name#>は、取得するエンティティの名前です。例:Manager

<#Sort key#>は、リクエストが注文に使用するキーの名前です。たとえば、エンティティnameの属性です。Manager

だから、私の例では:

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name"
    ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

ソート記述子の配列を設定するためsetSortDescriptors:、注文するキーに対して複数のキーを指定できます。nameたとえば、とに対して注文するように指定しますsalary。ソート記述子は、sortDescriptors配列に表示される順序で適用されます。したがって、私の例では、最初にname、次にsalary

だから、私の例では、

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name"
    ascending:YES];
NSSortDescriptor *sortBySalary = [[NSSortDescriptor alloc] initWithKey:@"salary"
    ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, sortBySalary, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

お役に立てば幸いです。

編集

fetchedObjectsが含まれているためNSManagedObject(リクエストの結果タイプを変更しなかったと思います)、次のように繰り返す必要があります。

for(NSManagedObject* currentObj in fetchedObjects) {

    NSLog(@"Print the name %@", [currentObj valueForKey:@"name"]);
}

したがって、キー値コーディングを介して属性または関係にアクセスする必要があります。生活を楽にするために、 organizing-core-data-for-iosのNSManagedObjectように作成したエンティティのサブクラスを作成することを考えることができます。

于 2012-07-22T13:34:42.213 に答える