具有不同记录和 UIPickerView 的 NSFetchRequest

Posted

技术标签:

【中文标题】具有不同记录和 UIPickerView 的 NSFetchRequest【英文标题】:NSFetchRequest with distinct records and UIPickerView 【发布时间】:2012-10-23 20:08:56 【问题描述】:

我正在尝试使用提取结果填充UIPickerView。我能够做到。由于有重复,我决定使用以下代码来获取不同的记录和只需要的属性。该代码工作正常,因为数组 array1dictlevel1 具有正确的数据(如下所示)。我不知道如何将array1 放入选择器视图中?

    NSError *error;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Factors" inManagedObjectContext:managedObjectContext];

    [fetchRequest setEntity:entity];
    [fetchRequest setResultType:NSDictionaryResultType];
    [fetchRequest setReturnsDistinctResults:YES];
    [fetchRequest setPropertiesToFetch:@[@"level1"]];

    self.title = @"Factors";
    array1 = [[NSArray alloc] init];
    array1 = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
    NSDictionary *dictlevel1 = [array1 dictionaryWithValuesForKeys:[NSArray arrayWithObject:@"level1"]];

    NSLog(@"%@", array1[1]);
    NSLog(@"%@", [dictlevel1 dictionaryWithValuesForKeys:[NSArray arrayWithObject:@"level1"]]);

这是NSLog的输出:

2012-10-23 14:55:47.774 CoreData2[1477:c07] (
        
        level1 = "External Combustion Boilers";
    ,
        
        level1 = "Internal Combustion Engines";
    ,
        
        level1 = "Industrial Processes";
    ,
        
        level1 = "Petroleum and Solvent Evaporation";
    ,
        
        level1 = "Waste Disposal";
    ,
        
        level1 = "Stationary Source Fuel Combustion";
    ,
        
        level1 = "Miscellaneous Area Sources";
    ,
        
        level1 = "Mobile Sources";
    ,
        
        level1 = "Solvent Utilization";
    ,
        
        level1 = "Storage and Transport";
    ,
        
        level1 = "Waste Disposal, Treatment, and Recovery";
    ,
        
        level1 = "Natural Sources";
    
)

2012-10-23 14:55:47.775 CoreData2[1477:c07] 
    level1 =     (
        "External Combustion Boilers",
        "Internal Combustion Engines",
        "Industrial Processes",
        "Petroleum and Solvent Evaporation",
        "Waste Disposal",
        "Stationary Source Fuel Combustion",
        "Miscellaneous Area Sources",
        "Mobile Sources",
        "Solvent Utilization",
        "Storage and Transport",
        "Waste Disposal, Treatment, and Recovery",
        "Natural Sources"
    );

【问题讨论】:

快速代码注释:你不需要这个初始化行:array1 = [[NSArray alloc] init];。您将从executeFetchRequest:error: 返回一个 NSArray 实例。如果您不使用 ARC,那么您也会泄漏该初始化数组。 感谢您的提示。我将在我的代码中更改它。 【参考方案1】:

我建议使用这样的代码 sn-p 来获得结果字典中给定键(例如 endCalYear)的不同结果 (@distinctUnionOfObjects):

NSArray *distinctYears = [periodsFilteredByDates
                valueForKeyPath:@"@distinctUnionOfObjects.endCalYear"];

pickerView:numberOfRowsInComponent: 中,您可以使用distinctYears.count 返回行数,在pickerView:titleForRow:forComponent: 中,您可以使用这样的代码 sn-p 为每个标题返回一个字符串:

NSNumber *endCalYear = distinctResults[row];
NSString *rowTitle = [NSString stringWithFormat:@"%@",endCalYear];
return rowTitle;

【讨论】:

【参考方案2】:

很像UITableView,您必须处理UIPickerViewDataSourceUIPickerViewDelegate 协议方法,它们为选择器提供数据。有关详细信息,请参阅链接文档。

【讨论】:

我用过。 UIPickerView 可以正常加载数据。我的麻烦出现了,因为数据存储中有重复项,所以我只想获取唯一值。因此,我使用了“NSDictionaryResultType”并仅获取我需要的列。返回的结果不同(字典类型?),我不能在 UIPickerView 方法中使用它。

以上是关于具有不同记录和 UIPickerView 的 NSFetchRequest的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有多个组件的 UIPickerView 中为特定组件添加图像?

如何使用 UIPickerView 在一个视图中填充不同的文本字段?

UIPickerView从中间的选定行开始

第十二篇 - UIPickerView

UIPickerVIew viewForRow 中的重用视图:丢失其子视图?

A记录,CNAME ,NS记录