циклы while (sqlite3_step (Statement) == SQLITE_ROW) никогда не выполняются - PullRequest
4 голосов
/ 02 февраля 2011

Привет всем, у меня есть некоторые проблемы с использованием sqlite в IOS.У меня есть выбор данных из базы данных, а затем я хочу сохранить эти данные в переменной.Но когда я использую цикл while(sqlite3_step(statement) == SQLITE_ROW), код никогда не выполняется.

вот мой код:

-(void)retrieveProjectNameFromDb:(NSString *)segmenId{
NSString *query;
NSString *nameProjectStr; 

NSString *dbPath = [[NSBundle mainBundle] pathForResource:@"database" ofType:@"sqlite"];
if (sqlite3_open([dbPath UTF8String], &db) != SQLITE_OK) {
    sqlite3_close(db);
    NSAssert(0, @"Database failed to open.");

}else {
    query = [NSString stringWithFormat:@"SELECT remote_projectname, remote_base_uri FROM REMOTE_SETTING WHERE remote_settingid = '%@' ORDER BY remote_projectname", segmenId];
    NSLog(@"query : %@", query);
}

sqlite3_stmt *statement;


if(sqlite3_prepare_v2(db, [query UTF8String], -1, &statement, nil)==SQLITE_OK){

    NSLog(@"sqlite row : %d", SQLITE_ROW);
    NSLog(@"sqlite 3 : %d", sqlite3_step(statement));

    while (sqlite3_step(statement) == SQLITE_ROW) {


        char *nameProject = (char *)sqlite3_column_text(statement, 0);
        if (nameProject == nil) {
            NSLog(@"UNNAMED");
        }else {
            NSLog(@"else");

            nameProjectStr = [NSString stringWithUTF8String:nameProject];
        }

        projectName.text = nameProjectStr;
        nameProject = nil;  
    }

    NSLog(@"project name : %@", projectName.text);


    sqlite3_close(db);

}

}

, когда я nslog значение, sqlite3_step (оператор) всегда показывают 101 и sqlite_row всегда показывают 100. Почему это может произойти ??Может ли кто-нибудь помочь мне, пожалуйста?

спасибо

С уважением

-risma-

Ответы [ 4 ]

6 голосов
/ 02 февраля 2011

Как вы упомянули, sqlite3_step (оператор) всегда показывает 101, что означает, что sqlite3_step завершил выполнение, следовательно, это означает, что ваш запрос sql не возвращает никаких строк из базы данных.Я бы порекомендовал вам сначала проверить в базе данных, существует ли в таблице REMOTE_SETTING какая-либо запись для remote_settingid, на которую вы ссылаетесь.

Для справки я взял следующий постоянный фрагмент из sqlite.org

#define SQLITE_DONE        101  /* sqlite_step() has finished executing */
3 голосов
/ 11 ноября 2013

Удалите запись NSLog, в которой у вас есть sqlite3_step (). Поскольку у вас есть оператор NSLog, выполняющий sqlite3_step (), запись здесь уже пройдена. Следовательно, ваш цикл while не будет выполняться, так как больше нет строк для перехода. Я думаю, что это, безусловно, поможет вам. :)

0 голосов
/ 25 ноября 2011

Попробуйте что-нибудь подобное ..

sqlite3 *database1;
    NSString *sqlStatement1 = @"";
    if(sqlite3_open([databasePath UTF8String], &database1) == SQLITE_OK) 
    {
        sqlStatement1 = [NSString stringWithString:@"SELECT uniqueid from shortlisted"];
        sqlite3_stmt *compiledStatement1;
        if(sqlite3_prepare_v2(database1, [sqlStatement1 cStringUsingEncoding:NSUTF8StringEncoding], -1, &compiledStatement1, NULL) == SQLITE_OK) 
        {
            while(sqlite3_step(compiledStatement1) == SQLITE_ROW) 
            {
                 NSString * str = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];

            }   
        }
        sqlite3_finalize(compiledStatement1);
        sqlite3_close(database1);


    }

Также закрывайте экземпляр базы данных всякий раз, когда вы открываете их .. если вы не закрываете экземпляр, это может вызвать проблемы ..

Извините, я вставляю это из своего проекта ... но на самом деле я немного спешу ... Я изменю этот ответ, когда доберусь до дома ...

0 голосов
/ 02 февраля 2011

Из вашего описания вывода журнала я бы предположил, что ваш запрос возвращает пустой набор строк. Однако я вижу здесь две другие проблемы:

  1. Вы отбрасываете результат вашего первого вызова на sqlite3_step, потому что вы регистрируете его, а затем немедленно снова вызываете sqlite3_step. Это означает, что вы пропустите первый ряд.
  2. Вы, вероятно, не должны закрывать базу данных после одного запроса. Вы должны завершить оператор после запроса, но закрывать базу данных, только когда ваше приложение закрывается.

Попробуйте:

if(sqlite3_prepare_v2(db, [query UTF8String], -1, &statement, nil)==SQLITE_OK){

    NSLog(@"sqlite row : %d", SQLITE_ROW);
    int stepResult = sqlite3_step(statement);
    NSLog(@"sqlite 3 : %d", stepResult);

    while (stepResult == SQLITE_ROW) {


        char *nameProject = (char *)sqlite3_column_text(statement, 0);
        if (nameProject == nil) {
            NSLog(@"UNNAMED");
        }else {
            NSLog(@"else");

            nameProjectStr = [NSString stringWithUTF8String:nameProject];
        }

        projectName.text = nameProjectStr;
        nameProject = nil;  
        stepResult = sqlite3_step(statement);
    }

    NSLog(@"project name : %@", projectName.text);

    sqlite3_finalize(&statement);

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