22

Core Data Documentationには、次のように記載されています。

[fetched]プロパティに関連付けられたフェッチ要求には並べ替え順序を付けることができるため、フェッチされたプロパティを順序付けることができます。

Xcodeのデータモデルエディタでフェッチされたプロパティの並べ替え記述子を指定するにはどうすればよいですか?関連するフィールドがどこにも見つかりません。これで違いがあれば、私はiPhoneプラットフォーム用に開発しています。

グラフィカルモデルエディタでこれが不可能な場合、コード内のフェッチされたプロパティのフェッチリクエストを変更して、ソート記述子を持つようにするにはどうすればよいですか?

4

8 に答える 8

37

モデルのフェッチされたプロパティを実際に取得し、それに並べ替え記述子を追加できます (これもコードで)。Core Data を含むテンプレートのいずれかを選択した場合、XCode が AppDelegate で生成する標準メソッドでこれを行いました。

ところで。これにより、データ モデル内のすべてのモデルでフェッチされたすべてのプロパティが並べ替えられます。あなたはそれを巧妙に適応させることができましたが、名前でソートする必要があるプロパティを取得した 7 つの個別のモデルをソートする最も簡潔な方法でした。うまくいきます。

/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created by merging all of the models found in the application bundle.
 */
- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    

    // Find the fetched properties, and make them sorted...
    for (NSEntityDescription *entity in [managedObjectModel entities]) {
        for (NSPropertyDescription *property in [entity properties]) {
            if ([property isKindOfClass:[NSFetchedPropertyDescription class]]) {
                NSFetchedPropertyDescription *fetchedProperty = (NSFetchedPropertyDescription *)property;
                NSFetchRequest *fetchRequest = [fetchedProperty fetchRequest];

                // Only sort by name if the destination entity actually has a "name" field
                if ([[[[fetchRequest entity] propertiesByName] allKeys] containsObject:@"name"]) {
                    NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
                    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortByName]];
                    [sortByName release];
                }
            }
        }
    }

    return managedObjectModel;
}
于 2009-09-26T05:19:05.357 に答える
13

グラフィカルエディターでそれらを指定しません(私の知る限り)。

フェッチを行うコードでそれらを指定します。

NSFetchRequest* request = [[NSFetchRequest alloc] init];
NSEntityDescription* entity = [NSEntityDescription entityForName:@"whatYouAreLookingFor"
    inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];

// here's where you specify the sort
NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc]
                                initWithKey:@"name" ascending:YES];
NSArray* sortDescriptors = [[[NSArray alloc] initWithObjects: sortDescriptor, nil] autorelease];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];

fetchedResultsController = [[NSFetchedResultsController alloc]
               initWithFetchRequest:request
               managedObjectContext:self.managedObjectContext
                 sectionNameKeyPath:nil
                          cacheName:@"myCache"];
于 2009-07-02T22:31:11.847 に答える
5

モデリング ツールには、フェッチ リクエストで並べ替え記述子を設定する方法がないようです。

モデルをロードした後、それを永続ストアコーディネーターに関連付ける前に、ソート順を制御したいフェッチされたプロパティの説明を見つけ、それらのフェッチ要求をソートを持つフェッチ要求に置き換えることが可能である必要があります[1]。それらに設定された記述子。

[1] 原則として、これは機能するはずです。実際には、私はそれを行ったりテストしたりしていません。

于 2009-07-02T22:22:35.313 に答える
5

Tim Shadel の優れた回答を使用して、NSManagedObject サブクラスごとの並べ替えを追加しました...

...Tier.m (NSManagedObject サブクラス) 内...

+ (void)initialize
{
    if(self == [Tier class])
    {
        NSFetchedPropertyDescription *displayLessonPropertyDescription = [[[Tier entityDescription] propertiesByName] objectForKey:@"displayLesson"];
        NSFetchRequest *fetchRequest = [displayLessonPropertyDescription fetchRequest];

        NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"displayOrder" ascending:YES];
       [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortByName]];
        [sortByName release];
    }
}
于 2012-11-04T01:22:27.990 に答える
0

これをNSManagedObjectサブクラスに入れます:

+ (void)initialize
{
    if (self != [EntityManagedObjectSubClass class]) return;
    NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
    NSEntityDescription *entityDescription = [managedObjectModel entitiesByName][@"entityName"];
    NSFetchedPropertyDescription *fetchedPropertyDescription = [entityDescription propertiesByName][@"fetchedPropertyName"];
    NSFetchRequest *fetchRequest = [fetchedPropertyDescription fetchRequest];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"sortDescriptorKey" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
}

EntityManagedObjectSubClassentityNamefetchedPropertyNameおよびsortDescriptorKeyを独自のものに置き換えます。

于 2013-01-23T13:01:35.023 に答える
0

残念ながら、ソート機能は多少制限されています。たとえば、数値を含む NSString であるフィールドを取得して、数値順にソートすることはできません。少なくとも、SQLite バッキング ストアではできません。ただし、文字列をアルファベット順に並べ替えたり、数値として格納された値のみを数値順に並べ替えたりしている限り、フェッチ要求に適用された NSSortDescriptor は正常に機能します。

于 2009-09-06T16:13:15.807 に答える
-1

ジェフ、文字列が右揃えの場合は、文字列を並べ替えることができます。" 123" > " 23" など。しかし、iirc ascii スペースは数値の後にあります。そうであれば、NSNumber (compare: メソッドをサポートする) である動的プロパティを作成し、numberFromString: メソッドを使用して文字列から数値を作成します。次に、並べ替えで数値フィールドを指定できます。インターフェイスで:

@property NSString *stringIsaNumber; // in the data model
@property NSNumber *number;

実装では:

@dynamic stringIsaNumber; 
- (NSNumber *) number ;
{ return [self.stringIsaNumber numberFromString]; }
- (void) setNumber:(NSNumber *)value;
{ self.stringIsaNumber = [NSString stringWithFormat:@"%5i",value) }

ps plzコーディングエラーを許してください、これは私の頭の上から外れています。

于 2011-02-16T00:06:39.573 に答える