在核心数据中获取两个属性的正确方法

Posted

技术标签:

【中文标题】在核心数据中获取两个属性的正确方法【英文标题】:Proper way to fetch two attributes in core data 【发布时间】:2014-05-01 10:19:06 【问题描述】:

我有一个名为 Route 的实体和来自该实体的两个属性,分别名为 LongitudeLatitude。 App的功能很简单:从LongitudeLatitude获取数据并创建一个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字典数组,您可以从中创建CLLocations。

【讨论】:

我的回答是假设属性有更常见的小写名称(“经度”、“纬度”)。

以上是关于在核心数据中获取两个属性的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

核心数据中的 Fetched Property 返回不正确的计数

一对多关系核心数据:在prepareForSegue中获取:

核心数据获取唯一属性

如何在 IOS Swift 中获取核心数据中的多对多关系?

核心数据:在获取时重命名属性

从核心数据读取时获取属性名称和值