Как выполнить поиск в списке, чтобы получить значение для определенного ключа - PullRequest
1 голос
/ 01 апреля 2012

Я использую 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 , который в данном случае является уникальным ключом для Аликанте .Но в моем графическом интерфейсе я, очевидно, хочу отображать Аликанте, а не числовое представление.

Так есть ли простой способ поиска в этом файле 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 ]

3 голосов
/ 01 апреля 2012

Вы можете загрузить лист в NSDictionary по методу:

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

Затем просто получите доступ к значениям, как для любого словаря:

NSDictionary *region = [dict valueForKey:@"City"];
NSString *name = [region objectForKey:@"Value"];
1 голос
/ 01 апреля 2012

Мне не хватает данных, чтобы действительно представить его точно, но вы можете использовать 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:
    }
}];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...