如何在plist中搜索以检索特定键的值

时间:2012-04-01 15:06:16

标签: objective-c xcode plist

我正在使用plist为我的应用用户存储国家/地区数据。我有这个<dict>列表,其中包含多个国家/地区。每个国家/地区都有几个。每个地区都有区域。每个地区都有许多城市

所以我的列表如下所示:

<dict>
    <key>Country</key>
    <array>
        <dict>
            <key>ISO</key>
            <string>ES</string>
            <key>Value</key>
            <string>Spain</string>
            <key>Children</key>
            <array>
                <dict>
                    <key>ISO</key>
                    <string>AL</string>
                    <key>Value</key>
                    <string>Andalucia</string>
                    <key>Children</key>
                    <array>
                        ...
                    </array>
                </dict>
            </array>
        </dict>
    </array>
</dict>

最详细的节点是保存信息的城市:

<dict>
    <key>ISO</key>
    <string>03002</string>
    <key>Value</key>
    <string>ALICANTE</string>
</dict>

在数据库中,我然后存储 03002 ,这是 Alicante 的唯一键。但在我的GUI中,我显然想要显示Alicante而不是数字表示。

那么有一种简单的方法来搜索此plist文件以找到此ISO的匹配值吗?

谢谢!

修改

目前我创建了这个方法。它可以解决问题,但我无法真正称之为高效编码。所以请指教......

- (NSString *)getCityNameForKey: (NSString *)ISO {
    NSString *cityName = @"";
    NSArray *citySource = [[Locations getInstance] toDataSource];

    for (int i = 0; i < [citySource count]; i++) {
        //Country
        NSDictionary *p_dictionary = [citySource objectAtIndex:i];
        NSArray *provinces = [p_dictionary objectForKey:@"Children"];
        if ([provinces count] > 0) {
            //Province
            for (int j = 0; j < [provinces count]; j++) {
                NSDictionary *r_dictionary = [provinces objectAtIndex:j];
                NSArray *regions = [r_dictionary objectForKey:@"Children"];
                if ([regions count] > 0) {
                    //City
                    for (int k = 0; k < [regions count]; k++) {
                        NSDictionary *c_dictionary = [regions objectAtIndex:k];
                        NSArray *cities = [c_dictionary objectForKey:@"Children"];
                        if ([cities count] > 0) {
                            for (int l = 0; l < [cities count]; l++) {
                                NSDictionary *result_dict = [cities objectAtIndex:l];
                                if ([[result_dict objectForKey:@"ISO"] isEqualToString:ISO]) {

                                    index_country = i;
                                    index_province = j;
                                    index_region = k;
                                    index_city = l;                                    

                                    cityName = [result_dict objectForKey:@"Value"];
                                    return cityName;
                                    break;
                                }
                            }
                        }

                    }
                }
            }
        }
    }
    return cityName;
}

2 个答案:

答案 0 :(得分:3)

您可以使用以下方法将plist加载到NSDictionary

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

然后只需像访问任何字典一样访问值:

NSDictionary *region = [dict valueForKey:@"City"];
NSString *name = [region objectForKey:@"Value"];

答案 1 :(得分:1)

我没有足够的数据来准确描绘它,但您可以使用keyPath获取所有城市的数组,然后在此数组中使用谓词

这样的事情将是你如何开始将所有数据集成到一个数组中的开始

NSArray *cities = [countries valueForKeyPath:@"Children.Children"];

然后搜索你可以做类似的事情

__block NSString *name = nil;

[cities enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([[obj valueForKey:@"ISO"] isEqualToString:ISOValue]) {
        name = [obj valueForKey:@"Value"];
        *stop = YES:
    }
}];