2015-03-26 3 views
0

Добрый день,SQLite принести заявление

Мне нужно извлечь строки из моего SQLite таблицы, но мне нужно передать несколько параметров. Это мое утверждение, которое не работает.

SELECT * FROM messages WHERE currentuser=\"%@\" AND (belongstouser=\"%@\" OR mymsgforuser=\"%@\") ORDER BY ID ASC 

мне это нужно, чтобы сначала проверить на матч CurrentUser, то из этих матчей, чтобы проверить либо belongstouser или mymsgforuser матчей. Можно ли таким образом вложить предложение sqlite? Я попытался удалить скобки, и это тоже не сработало. Я также искал документацию sqlite и не мог найти решение.

+0

Никогда не используйте' stringWithFormat:.. 'построить строку запроса Правильно связывать значения с помощью соответствующих 'sqlite3_bind_xxx' функций. – rmaddy

+0

Будет ли функция связывания позволить мне построить запрос, который мне нужен? – adrian1kat

+0

да, это именно то, что существует для привязки – heximal

ответ

1

Я вижу неправильный синтаксис SQL. строковые константы должны быть заключены в кавычки одинарные кавычки (') вместо (") И как сказал rmaddy, вы бы лучше избегать stringWithFormat Используйте prepare statement технику

- (BOOL)_prepareStatement:(sqlite3_stmt **)statement withSQL:(const char *)sql { 
    sqlite3_stmt *s = *statement; 
    //caDatabase is declared as sqlite3 *caDatabase object 
    if (nil == s && sqlite3_prepare_v2(caDatabase, sql, -1, &s, NULL)!= SQLITE_OK) 
    { 
     [self _showError]; 
     *statement = nil; 
     return NO; 
    } 
    *statement = s; 
    return YES; 
} 
- (caObjectId)existObject:(caObjectId)objId withType:(caCacheObjectType)objType libraryID:(int)aLibraryID 
{ 
    @synchronized (self) 
    { 
     const char *caSQLexistObj = "SELECT id FROM objects WHERE objId = ? AND objType = ? AND libraryID = ?"; 
     if(![self _prepareStatement:&ca_existObjectStatement withSQL:caSQLexistObj]) { 
      //produce some error message 
      return; 
     } 
     sqlite3_bind_int(ca_existObjectStatement, 1, objId); 
     sqlite3_bind_int(ca_existObjectStatement, 2, objType); 
     sqlite3_bind_int(ca_existObjectStatement, 3, aLibraryID); 

     NSInteger result = sqlite3_step(ca_existObjectStatement); 
     if (result != SQLITE_ROW) 
     { 
      sqlite3_reset(ca_existObjectStatement); 
      return caObjectIdNone; 
     } 
     caObjectId cacheId = sqlite3_column_int(ca_existObjectStatement, 0); 
     sqlite3_reset(ca_existObjectStatement); 

     return cacheId; 
    } 
} 
+0

Спасибо! Я буду работать над этим, как только вернусь к своему компьютеру и дам вам знать. – adrian1kat

+0

Что такое функция 'caReturnIfNo'? Что такое метод '_prepareStatement: withSQL:'? – rmaddy

+0

Извините, я просто скопировал фрагмент кода из одного из моих проектов и забыл проверить его согласованность. Надеюсь, новое издание сделает вещи чище. – heximal

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