【发布时间】:2013-02-13 22:33:03
【问题描述】:
我有一个使用 CoreData 来存储 Customer 实体的应用程序。每个Customer 实体都有一个customerName、customerID 和其他属性。
然后我显示所有Customers 的列表,仅显示他们的customerName 和customerID。
我可以通过执行获取请求来获取所有Customer 实体来完成此操作,但是我只需要显示customerName 和customerID 属性。
问题 1:
我正在尝试使用 setPropertiesToFetch 仅指定这些属性,但每次它只返回数组中的 1 个对象。
这是我的方法的样子:
NSFetchRequest *fetchRequest = [NSFetchRequest new];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Customer" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSDictionary *entProperties = [entity propertiesByName];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entProperties objectForKey:@"customerName"],[entProperties objectForKey:@"customerID"], nil]];
[fetchRequest setFetchLimit:30];
NSError *error;
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
NSLog(@"fetched objects count = %d", [fetchedObjects count]);
if (error) {
NSLog(@"Error performing fetch = %@", [error localizedDescription]);
return nil;
} else {
NSLog(@"successful fetch of customers");
for( NSDictionary* obj in fetchedObjects ) {
NSLog(@"Customer: %@", [obj objectForKey:@"customerName"]);
}
return fetchedObjects;
}
返回的一个对象没问题,所以我知道它至少抓取了一个Customer 对象customerName 和customerID。我只需要它返回所有Customer 对象customerName 和customerID。
问题 2:
这是最好的方法吗?我的想法是数据库中可能有多达 10k+ 个 Customer 对象。因此,仅获取所需的属性以显示在表中而不是整个 Customer 对象将是内存效率的。
然后,当在表中选择客户时,我会获取整个 Customer 对象以显示其详细信息。
但是,我了解到,如果可以在不久的将来使用相应的实体,那么加载整个实体而不是仅加载其属性也是一种很好的做法。我想这个想法是单个获取请求比两个更好。
感谢您的帮助。
【问题讨论】:
-
如果取消获取限制会怎样?
标签: objective-c xcode database-design core-data nsfetchrequest