iPhone SQLITE Выбор оператора с переменными - PullRequest
0 голосов
/ 15 июля 2011

Я создаю приложение для iOS, которое считывает данные из одной таблицы SQLITE с использованием переменных.У меня нет проблем с выполнением оператора SELECT, когда все переменные заполнены, но я хочу, чтобы в конечном итоге было большое количество переменных и позволяло пользователям пропускать те, которые они не считают для них значимыми.Другими словами, как я могу заставить это работать, даже когда переменные равны нулю или 0, такие как игнорирование этой части оператора select, но продолжение?Я пытался использовать операторы IF или CASE, но затем я получаю необъявленную ошибку.Я мог бы повторить весь getInitialDataToDisplay с IF, но должен быть более простой способ.

+ (void) getInitialDataToDisplay:(NSString *)dbPath{
int addOne = [[NSUserDefaults standardUserDefaults] integerForKey: @"criterion1key"]; 
int addTwo = [[NSUserDefaults standardUserDefaults] integerForKey: @"criterion2key"]; 
int addThree = [[NSUserDefaults standardUserDefaults] integerForKey: @"criterion3key"];      

if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {       
NSString *querystring= [NSString stringWithFormat:@"select * from animalswhere description > %i and description < %i and cash >= %i",addOne, addTwo, addThree];            //WORKS FINE IF ALL VARIABLES HAVE VALUES, BUT DOES NOTHING IF VARIABLES ARE EMPTY            
const char *sql = [querystring UTF8String];             
sqlite3_stmt *selectstmt;  if(sqlite3_prepare_v2(database, sql, -1,&selectstmt, NULL) == SQLITE_OK) 
{                       
while(sqlite3_step(selectstmt) == 
SQLITE_ROW) { 

NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);

    Animal *animal = [[Animal alloc] initWithPrimaryKey:primaryKey];
            animal.name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)];
             animal.description = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)];   
        animal.imageURL = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 5)];   
        animal.cash = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 32)]; 
            [appDelegate.animals addObject:animal];             
[animal release];           
}       
   }    
      }         else        sqlite3_close(database); 
}

1 Ответ

0 голосов
/ 15 июля 2011

Похоже, вам нужно использовать переменные / значения маркера и небольшую логическую логику:

SELECT valuea, valueb, valuec
FROM table
WHERE valuea = %inputParmA
AND (%inputParmB = 0 OR valueb = %inputParmB)

Это будет иметь эффект выбора всех строк, где valuea соответствует переданному значению(из inputParmA), и, если inputParmB не ноль, valueb соответствует inputParmB.
Вам придется адаптировать это для своих нужд, но это быстрая и грязная альтернативас использованием динамического sql, если это недоступно (или трудно сгенерировать).
Не совсем уверен в производительности, но у меня есть запрос, который имеет около десятка из них, работает над базой данных с несколькими миллионами строк и возвращаетв течение минуты (сотни результатов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...