sqlite получает одну строку

#sqlite

Вопрос:

 NSString *cityInput = cityField.text; NSString *code = @""; NSString *query = @"SELECT code FROM country WHERE cityname = UPPER(?)"; sqlite3_stmt *statement; if (sqlite3_prepare_v2(database, [query UTF8String],-1, amp;statement, nil) == SQLITE_OK) {  sqlite3_bind_text(statement, 1, [cityInput UTF8String], -1, SQLITE_STATIC);  while(sqlite3_step(statement) == SQLITE_ROW) {  code = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];  } }  if(sqlite3_step(statement) != SQLITE_DONE){  NSLog(@"DB: query KO");  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"ALERT" message:@"City not found" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];  [alertView show];  return; }  sqlite3_close(database);  

Два вопроса:

1) для получения одной строки я должен использовать цикл while?

2) если в запросе нет результата, как предупредить «город не найден»

Ответ №1:

Очевидно, что вы получите последнюю строку,,

 code   

должен быть массив, который вы могли бы объявить так

 NSMutableArray *code=[NSMutableArray array];  

затем в цикле while используйте

 [code addobject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)]];  

Я надеюсь, что это достаточно ясно:)

Ответ №2:

  1. Использование while дает вам последнюю строку, и она не нужна. Добавьте предложение limit 1 в свой запрос или просто возьмите первую возвращенную строку;
  2. Решите, показывать ли предупреждение, проверив код возврата.

Ответ №3:

Может быть, два ответа,

1) Нет, просто предложение «если» подойдет

2) Выполните уступку, а затем запустите на ней предложение if

 int result = sqlite3_step(statement)  if (result == SQLITE_ROW){  //processline  }  else{  //show alert  }