该核心数据文件指出:
用[取]属性相关联的提取请求可以具有排序顺序,因此所获取的属性可被排序。
如何指定为在Xcode的数据模型编辑器所取得的财产的排序描述符? 我到处都找不到相关领域。 我为iPhone开发平台,如果这有什么差别。
如果通过图形化模型编辑器是不可能的,我怎么去在代码修改为所取得的财产的读取请求,以便它有一个排序描述符?
该核心数据文件指出:
用[取]属性相关联的提取请求可以具有排序顺序,因此所获取的属性可被排序。
如何指定为在Xcode的数据模型编辑器所取得的财产的排序描述符? 我到处都找不到相关领域。 我为iPhone开发平台,如果这有什么差别。
如果通过图形化模型编辑器是不可能的,我怎么去在代码修改为所取得的财产的读取请求,以便它有一个排序描述符?
建模工具似乎并未有办法设置的提取请求的排序描述符。
它应该是可能的[1]到,加载模型后,但它具有持久存储协调关联之前,找到您要控制排序的顺序取出属性描述,并取代它们与取有排序请求获取请求描述他们设置。
[1]在原则上,这应该工作。 在实践中,我并没有这样做,或者进行了测试。
实际上,你可以抓住模型获取属性和排序描述符添加到它(再次,在代码)。 我这样做的,如果你选择的核心数据模板之一是生成的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;
}
你不会在图形编辑器中指定它们(据我所知)。
你在你做出获取代码指定。
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"];
使用添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];
}
}
可悲的是,虽然,排序的功能是比较有限的。 例如,你不能把一个字段,该字段是包含许多一个NSString,和数值对它进行排序,至少不与一个SQLite后备存储。 只要你对字符串按字母顺序排序,数字只是对存储为数字值等等,虽然,NSSortDescriptor适用于读取请求的作品就好了。
要把它放到你的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]];
}
更换EntityManagedObjectSubClass
, entityName
, fetchedPropertyName
和sortDescriptorKey
用你自己的东西。
对于单个获取财产,斯威夫特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
注:在这个例子中,我强行解开值。 请确保您在您的实际代码占可选值!
杰夫,如果字符串是右对齐,你可以只排序上的字符串; “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原谅编码错误,这是从我的头顶。