在我的核心数据模型中,Person
有一个或多个Cars
,由无序的多对多关系“汽车”指定。通常,我需要检索按datePurchased
或dateLastUsed
订购的人员汽车。
到目前为止,我一直在为Person
carsByDatePurchased
添加自己的方法。这使用排序描述符对NSSet cars
进行排序并返回NSArray。
我可以/应该使用Fetched属性吗?每次我按照特定顺序需要汽车时,我会遇到使用排序描述符的一些性能开销,甚至可能实现我自己的carsByDatePurchased
缓存。看起来像是为我缓存了获取的属性 - 这是正确的吗?
获取的属性与我自己的实现有什么限制?
至关重要的是,获取的财产的价值在执行之间是否仍然存在?如果我更新了fetched属性并保存了我的上下文,那么下次启动应用程序时是否存储了值?
答案 0 :(得分:4)
获取的属性将起作用,事实上我在我自己的项目中使用了Post-> Comment关系,需要按'添加日期的索引'进行排序。
有许多警告:您无法在可视化编辑器中指定排序描述符,必须在代码中指定它。
我使用类似的东西
// 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 "index" field
if ([[[[fetchRequest entity] propertiesByName] allKeys] containsObject:@"index"])
{
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"index"
ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortByName]];
}
}
}
}
在My Post实体中,我有一个名为“sortedComments”的获取属性,定义为:
post == $FETCH_SOURCE
其中帖子具有多对多的“评论”关系,并且评论具有“帖子”反向
与此处的其他答案相反:使用像这样的获取属性的好处是,CoreData负责缓存并使缓存无效,因为帖子的评论或者拥有它们的帖子确实发生了变化。
答案 1 :(得分:2)
如果你想获得一些性能,可以使用NSFetchedResultsController进行提取并让它使用缓存。下次执行相同的提取时,提取速度会更快。在您的特定名称中,您必须缓存名称。看一下NSFetchedResultsController documentation。
答案 2 :(得分:1)
fetched属性基本上是一个获取请求。我不知道如何在GUI中为这些属性添加排序描述符,但我可能错了。但为什么不在您的carsByDatePurchased
方法中创建一个获取请求并提供排序描述符?它返回一个数组或结果(您可以将NSOrderedSet
廉价地包装在copyItems:
标志设置为no的情况下。
答案 3 :(得分:0)
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [delegate managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"DataRecord" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error;
fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *obj in fetchedObjects) {
NSLog(@"Name: %@", [obj valueForKey:@"name"]);
NSLog(@"Info: %@", [obj valueForKey:@"info"]);
NSLog(@"Number: %@", [obj valueForKey:@"number"]);
NSLog(@"Create Date: %@", [obj valueForKey:@"createDate"]);
NSLog(@"Last Update: %@", [obj valueForKey:@"updateDate"]);
}
NSManagedObject *obj = [fetchedObjects objectAtIndex:0];
[self displayManagedObject:obj];
selectedObject = obj;