Как извлечь данные поиска по имени из sqlite? - PullRequest
0 голосов
/ 03 февраля 2012

Я следовал руководству по созданию базы данных sqlite, вставке данных и поиску данных из нее и использовал метод ниже для извлечения данных из этой базы данных:

-(IBAction)findContacts{

    const char *dbpath = [databasePath UTF8String];
    sqlite3_stmt *statement;
    if (sqlite3_open(dbpath, &contactDB)==SQLITE_OK) {
        NSString *querySQL = [NSString stringWithFormat:@"SELECT adress, phone FROM CONTACTS WHERE name = \"%@\"", [name text]];
        status.text = querySQL;         
        const char *query_stmt = [querySQL UTF8String];

        if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK) {
            if (sqlite3_step(statement)==SQLITE_ROW) {

                NSString *adressField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)];
                adress.text = adressField;

                NSString *phoneField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)];
                phone.text = phoneField;

                status.text = @"Match Found";

                [adressField release];
                [phoneField release];} 

                    status.text = @"Match not Found";
                    adress.text = @"";
                    phone.text = @"";
            sqlite3_finalize(statement);}
        sqlite3_close(contactDB);}}

Когда я компилирую, ошибки нет!нет внимания!однако не работает ...

То, что я обнаружил, было то, что, поскольку

sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)

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

sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) != SQLITE_OK)

и увидел в файле status.text «совпадение не найдено».но все равно не удалось найти какой-либо истинный контакт внутри.

Вы поняли что-то не так с кодом?

Заранее спасибо ...

1 Ответ

1 голос
/ 03 февраля 2012

Вы действительно не хотите вводить блок, если только результат 'sqlite3_prepare_v2' на самом деле не SQLITE_OK.

Изменение требования равенства на '! =' Было интересной диагностикой, но, очевидно, это не изменениеэто должно быть навсегда оставлено в вашем тестовом коде.

Теперь, когда мы знаем, что sqlite3_prepare_v2 не возвращает код для успеха, возникает вопрос: какой код возвращает , который он возвращает?

Согласно документации, он должен возвращать один из кодов, показанных здесь:

http://sqlite.org/c3ref/c_abort.html

Вы также можете использовать sqlite3_errmsg для получения строкового представления.Смотри: http://sqlite.org/c3ref/errcode.html

...