在核心数据中获取两个属性的正确方法
Posted
技术标签:
【中文标题】在核心数据中获取两个属性的正确方法【英文标题】:Proper way to fetch two attributes in core data 【发布时间】:2014-05-01 10:19:06 【问题描述】:我有一个名为 Route
的实体和来自该实体的两个属性,分别名为 Longitude
和 Latitude
。
App的功能很简单:从Longitude
和Latitude
获取数据并创建一个NSArray。
例如:
Route 1 has Longitude=2 and Latitude=41
Route 2 has Longitude=3 and Latitude=42
Route 3 has Longitude=4 and Latitude=43
所以 Result 将是一个包含该内容的 NSArray:
[[CLLocation alloc] initWithLatitude:41 longitude:2],
[[CLLocation alloc] initWithLatitude:42 longitude:3],
[[CLLocation alloc] initWithLatitude:43 longitude:4],
但问题是,如果我从不同的 setupFetchedResultsController 获取这两个属性,我将无法将它们“连接”到它们相应的伙伴(我将获得 2 个单独的值列表)。还有另一种方法可以从“已连接”的 2 个属性中获取数据吗?
如果有人需要,这是我的fetchedResultsController
之一:
- (NSFetchedResultsController *)fetchedLatitudController
if (_fetchedLatitudController != nil)
return _fetchedLatitudController;
// 1 - Decide what Entity you want
NSString *entityName = @"Route"; // Put your entity name here
// 2 - Request that Entity
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
// 4 - Sort it if you want
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"latitude"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)]];
// 5 - Fetch it
self.fetchedLatitudController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
[self.fetchedLatitudController performFetch:nil];
return _fetchedLatitudController;
【问题讨论】:
请出示您的代码。你如何获取属性? 我使用setupfetchedResultsController的通用模板来获取。 【参考方案1】:没有必要使用 两个 获取结果控制器。获取的结果控制器 (默认情况下)获取托管对象子类的对象,然后您可以查询 对于所有属性。例如:
Route *route = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSNumber *lng = route.longitude;
NSNumber *lat = route.latitude;
但请注意,获取结果控制器通常与表格视图(或 集合视图)。如果您只想创建一个数组,那么您可以执行一个简单的 改为获取请求:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Route"];
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:request error:&error];
if (fetchedObjects == nil)
// Some error occurred ...
else
for (Route *route in fetchedObjects)
NSNumber *lng = route.longitude;
NSNumber *lat = route.latitude;
CLLocation *loc = [[CLLocation alloc] initWithLatitude:[lat doubleValue] longitude:[lng doubleValue]];
// ... add loc to your array ...
如果“Route”实体有许多属性,那么它可能更有效 设置
[request setResultType:NSDictionaryResultType];
[request setPropertiesToFetch:@[@"longitude", @"latitude"]];
只获取您感兴趣的属性。然后fetchedObjects
是
字典数组,您可以从中创建CLLocation
s。
【讨论】:
我的回答是假设属性有更常见的小写名称(“经度”、“纬度”)。以上是关于在核心数据中获取两个属性的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
核心数据中的 Fetched Property 返回不正确的计数