我正在使用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;
}
答案 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:
}
}];