XCode sqlite3 - SELECT всегда возвращает SQLITE_DONE - PullRequest
0 голосов
/ 13 января 2011

нуб, просящий о помощи после дня головокружения ....

Я работаю над приложением с базой данных sqlite3 с одной базой данных и двумя таблицами.Теперь я подошел к шагу, где я хочу выбрать из таблицы с аргументом.Код здесь:

-(NSMutableArray*) getGroupsPeopleWhoseGroupName:(NSString*)gn;{

 NSMutableArray *groupedPeopleArray = [[NSMutableArray alloc] init];

 const char *sql = "SELECT * FROM Contacts WHERE groupName='?'";

 @try { 
     NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);  
     NSString *docsDir = [paths objectAtIndex:0];  
     NSString *theDBPath = [docsDir stringByAppendingPathComponent:@"ContactBook.sqlite"];

     if (!(sqlite3_open([theDBPath UTF8String], &database) == SQLITE_OK))
     { NSLog(@"An error opening database."); }

     sqlite3_stmt *st;
     NSLog(@"debug004 - sqlite3_stmt success.");   

     if (sqlite3_prepare_v2(database, sql, -1, &st, NULL) != SQLITE_OK)
     { NSLog(@"Error, failed to prepare statement."); }

     //DB is ready for accessing, now start getting all the info.
     while (sqlite3_step(st) == SQLITE_ROW)
     {   

        MyContacts * aContact = [[MyContacts alloc] init];

        //get contactID from DB.
        aContact.contactID = sqlite3_column_int(st, 0);

        if (sqlite3_column_text(st, 1) != NULL)
        { aContact.firstName = [NSString stringWithUTF8String:(char *) sqlite3_column_text(st, 1)]; }
        else { aContact.firstName = @""; }

        // here retrieve other columns data ....

       //store these info retrieved into the newly created array.
       [groupedPeopleArray addObject:aContact];

       [aContact release];

    }

    if(sqlite3_finalize(st) != SQLITE_OK)
    { NSLog(@"Failed to finalize data statement."); }

    if (sqlite3_close(database) != SQLITE_OK)
    { NSLog(@"Failed to close database."); }

    }

 @catch (NSException *e) {
 NSLog(@"An exception occurred: %@", [e reason]);
 return nil;  }

 return groupedPeopleArray;}

MyContacts - это класс, в который я помещаю все переменные записи.

Моя проблема в том, что sqlite3_step (st) всегда возвращает SQLITE_DONE, так что я никогда не смогуполучить myContacts.(Я проверил это, проверив возвращаемое значение).

Что я здесь не так делаю?

Заранее большое спасибо!

Ответы [ 2 ]

2 голосов
/ 13 января 2011

Я думаю, что вы не привязываете значение, если не используете это

sqlite3_bind_text(stmt, 1, [groupName UTF8String], -1, SQLITE_STATIC);
1 голос
/ 13 января 2011

Вы не привязываете какое-либо значение к своему заявлению.

Вы буквально выполняете команду SELECT * FROM Contacts WHERE groupName = '?' как есть.

И это, вероятно, возвращает пустой набор, поэтому sqlite3_step возвращает SQLITE_DONE, в наборе нечего читать, все готово.

На этой странице приведен пример привязки параметров к выражению ..

РЕДАКТИРОВАТЬ: Кроме того, вам не нужны кавычки?

ВЫБРАТЬ * ИЗ КОНТАКТОВ, ГДЕ Groupname =?

затем используйте sqlite3_bind_text

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