2013-07-28 6 views
1

У меня есть iPad, который считывает данные из базы данных SQL. Следующий код работает отлично и извлекает 2 поля из каждой записи и считывает их в NSArray.Чтение из базы данных SQL в NSArray

Теперь мне нужно прочитать 5 полей, и я не могу не думать, что есть лучший способ сделать это, а не запускать 5 отдельных запросов через php (файл getinfo.php с параметром выбора, установленным на выберите разные поля).

Любые указатели на лучший способ для этого?

NSString *strURLClass = [NSString stringWithFormat:@"%@%@", @"http://wwwaddress/getinfo.php?choice=1&schoolname=",obsSchoolName]; 
NSArray *observationsArrayClass = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:strURLClass]]; 
observationListFromSQL = [[NSMutableArray alloc]init]; 
NSEnumerator *enumForObsClass = [observationsArrayClass objectEnumerator]; 

NSString *strURLDate = [NSString stringWithFormat:@"%@%@", @"http://wwwaddress/getinfo.php?choice=5&schoolname=",obsSchoolName]; 
NSArray *observationsArrayDate = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:strURLDate]]; 
observationListFromSQL = [[NSMutableArray alloc]init]; 
NSEnumerator *enumForObsDate = [observationsArrayDate objectEnumerator]; 

id className, dateOfObs; 

while (className = [enumForObsClass nextObject]) 
{ 
    dateOfObs = [enumForObsDate nextObject]; 
    [observationListFromSQL addObject:[NSDictionary dictionaryWithObjectsAndKeys:className, @"obsClass", dateOfObs, @"obsDate",nil]]; 
} 

ответ

1

Да, вы можете сделать это с меньшим количеством кода путем «складывания» заявления в петлю, и используя изменяемый словарь:

// Add other items that you wish to retrieve to the two arrays below: 
NSArray *keys = @[@"obsClass", @"obsDate"]; // Key in the dictionary 
NSArray *choices = @[@1, @5];    // Choice in the URL string 
NSMutableArray *res = [NSMutableArray array]; 
NSMutableArray *observationListFromSQL = [NSMutableArray array]; 
for (int i = 0 ; i != keys.count ; i++) { 
    NSNumber *choice = choices[i]; 
    NSString *strURLClass = [NSString stringWithFormat:@"http://wwwaddress/getinfo.php?choice=%@&schoolname=%@", choice, obsSchoolName]; 
    NSArray *observationsArray = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:strURLClass]]; 
    NSEnumerator *objEnum = [observationsArrayClass objectEnumerator]; 
    NSString *key = keys[i]; 
    NSMutableDictionary *dict; 
    if (res.count < i) { 
     dict = res[i]; 
    } else { 
     dict = [NSMutableDictionary dictionary]; 
     [res addObject:dict]; 
    } 
    id item; 
    while (item = [objEnum nextObject]) { 
     [res setObject:item forKey:key]; 
    } 
} 
+0

Спасибо. Это аккуратно и означает меньше кода, но он все еще запускает php-запрос 5 раз, если я хочу 5 полей. Может ли данные не передаваться из одного вызова файла php? – RGriffiths

+0

@RichardGriffiths Это зависит от службы, предоставляющей данные: если она предоставляет вам возможность предоставить несколько вариантов в одном вызове и определяет способ декодирования возвращаемых данных, тогда ответ будет «да». Кроме того, если есть способ не предоставлять какие-либо варианты, верните все поля, а затем выберите пять полей, которые вы хотите, вы можете сэкономить на круговых поездках за счет получения большего количества данных (обычно это очень выгодный компромисс) , В противном случае вам потребуется выполнить несколько вызовов. – dasblinkenlight

+0

Brillant. Очень полезно спасибо. Попытка вашего кода, и я получаю ошибку на dict = res [i]; и res [i] = dict; «Ожидаемый метод чтения элемента массива, который не найден на объекте типа« NSMutableDictionary * ». Также должна строка NSEnumerator * objEnum = [замечанияArrayClass objectEnumerator]; быть просто «наблюдениями»? – RGriffiths

Смежные вопросы