如何核心数据获取的属性进行排序(How to sort Core Data fetched prop

2019-06-24 17:26发布

该核心数据文件指出:

用[取]属性相关联的提取请求可以具有排序顺序,因此所获取的属性可被排序。

如何指定为在Xcode的数据模型编辑器所取得的财产的排序描述符? 我到处都找不到相关领域。 我为iPhone开发平台,如果这有什么差别。

如果通过图形化模型编辑器是不可能的,我怎么去在代码修改为所取得的财产的读取请求,以便它有一个排序描述符?

Answer 1:

建模工具似乎并未有办法设置的提取请求的排序描述符。

它应该是可能的[1]到,加载模型后,但它具有持久存储协调关联之前,找到您要控制排序的顺序取出属性描述,并取代它们与取有排序请求获取请求描述他们设置。

[1]在原则上,这应该工作。 在实践中,我并没有这样做,或者进行了测试。



Answer 2:

实际上,你可以抓住模型获取属性和排序描述符添加到它(再次,在代码)。 我这样做的,如果你选择的核心数据模板之一是生成的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;
}


Answer 3:

你不会在图形编辑器中指定它们(据我所知)。

你在你做出获取代码指定。

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"];


Answer 4:

使用添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];
    }
}


Answer 5:

可悲的是,虽然,排序的功能是比较有限的。 例如,你不能把一个字段,该字段是包含许多一个NSString,和数值对它进行排序,至少不与一个SQLite后备存储。 只要你对字符串按字母顺序排序,数字只是对存储为数字值等等,虽然,NSSortDescriptor适用于读取请求的作品就好了。



Answer 6:

要把它放到你的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]];
}

更换EntityManagedObjectSubClassentityNamefetchedPropertyNamesortDescriptorKey用你自己的东西。



Answer 7:

对于单个获取财产,斯威夫特4时,Xcode 9.4:

// retrieve the fetched property's fetch request    
let fetchedPropertyRequest = (modelName.entitiesByName["entityName"]!.propertiesByName["fetchedPropertyName"] as! NSFetchedPropertyDescription).fetchRequest

// set up the sort descriptors
let sortDescriptors = [NSSortDescriptor(key: "keyName", ascending: true)]

// add the sort descriptors to the fetch request
fetchedPropertyRequest!.sortDescriptors = sortDescriptors

这是同样的事情loooonnnnnnggggggg方式:

// retrieve the fetched property's fetch request
let theEntityDescription: NSEntityDescription = modelName.entitiesByName["entityName"]!
let theFetchedPropertyDescription = theEntityDescription.propertiesByName["fetchedPropertyName"]! as! NSFetchedPropertyDescription
let theFetchedPropertyRequest = theFetchedPropertyDescription.fetchRequest

// set up the sort descriptors
let sortDescriptor1 = NSSortDescriptor(key: "keyName", ascending: true)
let theSortDescriptors = [sortDescriptor1]

// add the sort descriptors to the fetch request
theFetchedPropertyRequest!.sortDescriptors = theSortDescriptors

注:在这个例子中,我强行解开值。 请确保您在您的实际代码占可选值!



Answer 8:

杰夫,如果字符串是右对齐,你可以只排序上的字符串; “123”> “23” 等。 但IIRC ASCII空间后的数字,如果是这样,那么你会做的是创建一个动态属性,它是一个NSNumber(支持比较:方法),并使用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原谅编码错误,这是从我的头顶。



文章来源: How to sort Core Data fetched properties