objective framework development apple iphone xcode sorting core-data fetched-property

iphone - framework - Cómo ordenar las propiedades extraídas de Core Data



swift ios documentation (8)

La documentación de datos básicos establece que:

La solicitud de recuperación asociada con la propiedad [fregada] puede tener un orden de clasificación y, por lo tanto, se puede ordenar la propiedad famada.

¿Cómo especifico los descriptores de clasificación para la propiedad obtenida en el editor de modelo de datos de Xcode? No puedo encontrar un campo relevante en cualquier lugar. Estoy desarrollando para la plataforma de iPhone, si esto hace alguna diferencia.

Si esto no es posible a través del editor de modelo gráfico, ¿cómo hago para modificar la solicitud de búsqueda de la propiedad extraída en el código para que tenga un descriptor de clasificación?


De hecho, puede tomar la propiedad de búsqueda del modelo y agregarle los descriptores de clasificación (nuevamente, en el código). Hice esto en el método estándar que XCode genera en tu AppDelegate si eliges una de las plantillas con Core Data:

Por cierto. Esto ordena TODAS las propiedades recuperadas en TODOS los modelos en su modelo de datos. Podría ser elegante y adaptable con él, pero era la manera más sucinta de manejar la clasificación de los 7 modelos separados que cada uno tenía propiedades que debían ser ordenadas por nombre. Funciona bien.

/** 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; }


Jeff, si las cuerdas están alineadas a la derecha, podrías clasificarlas; "123"> "23" y así sucesivamente. Pero el espacio iirc ascii está detrás de los números, y si es así, entonces lo que haría es crear una propiedad dinámica que sea un número NSN (que admita el método compare:), y use el método numberFromString: para hacer un número a partir de la cadena. A continuación, puede especificar el campo de número en la clasificación. En la interfaz:

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

en la implementación:

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

ps plz perdonar errores de codificación, esto está fuera de mi cabeza.


La herramienta de modelado no parece tener una forma de establecer los descriptores de clasificación en la solicitud de recuperación.

Debería ser posible [1], después de cargar el modelo, pero antes de asociarlo con un coordinador de tienda persistente, encontrar las descripciones de las propiedades buscadas para las que desea controlar el orden, y reemplazar sus solicitudes de recuperación con las solicitudes de búsqueda que tienen clasificación descriptores establecidos en ellos.

[1] En principio esto debería funcionar. En la práctica, no lo he hecho ni lo he probado.


Lamentablemente, sin embargo, la capacidad de clasificación es algo limitada. Por ejemplo, no puede tomar un campo que sea un NSString que contenga un número y clasificarlo numéricamente, al menos no con un almacén de respaldo de SQLite. Sin embargo, mientras esté ordenando alfabéticamente en cadenas, numéricamente solo en valores almacenados como números, etc., el NSSortDescriptor aplicado a la solicitud de búsqueda funciona bien.


No los especifica en el editor gráfico (que yo sepa).

Los especificas en el código donde realizas la búsqueda.

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


Para una propiedad extraída, Swift 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

Aquí es lo mismo de la manera 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

Nota: para este ejemplo, fuerza valores desenvueltos. ¡Asegúrese de tener en cuenta los valores opcionales en su código real!


Ponga esto en su subclase 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]]; }

Reemplace EntityManagedObjectSubClass , entityName , fetchedPropertyName y sortDescriptorKey con sus propias cosas.


Usando la gran respuesta de Tim Shadel, agregué ordenación de subclase NS-Objeto administrado ...

... en Tier.m (que es una subclase 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]; } }