while(sqlite3_step(statement)== SQLITE_ROW)循环永远不会执行

时间:2011-02-02 09:46:01

标签: ipad sqlite while-loop

大家好 我在IOS中使用sqlite有一些问题。我从数据库中选择数据,然后我想将该数据保存在变量中。但是当我使用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 个答案:

答案 0 :(得分:5)

正如你所提到的,sqlite3_step(语句)总是显示101,这意味着sqlite3_step已经完成执行,因此这意味着你的sql查询没有从数据库返回任何行。我建议你首先检查数据库中是否存在REMOTE_SETTING表中存在的你所指的remote_settingid的记录。

供您参考,我从sqlite.org

获取了以下常量片段
#define SQLITE_DONE        101  /* sqlite_step() has finished executing */

答案 1 :(得分:3)

删除您拥有sqlite3_step()的NSLog条目。由于您的NSLog语句正在执行sqlite3_step(),因此该记录已在此处逐步执行。因此,您的while循环将不会执行,因为没有更多行要逐步执行。 我认为这肯定会对你有所帮助。 :)

答案 2 :(得分:0)

根据您对日志记录输出的描述,我猜您的查询返回一个空行集。但是我可以在这里看到另外两个问题:

  1. 您放弃首次拨打sqlite3_step的结果,因为您已将其记录,然后立即再次呼叫sqlite3_step。这意味着你会错过第一行。
  2. 您可能不应该在单个查询后关闭数据库。您应该在查询后最终确定语句,但只在应用程序关闭时关闭数据库。
  3. 尝试:

    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);
    
    }
    

答案 3 :(得分:0)

尝试这样的事情......

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);


    }

每当你打开它们时也会关闭数据库实例..如果你没有关闭一个实例那么可能会导致问题..

抱歉,我从我的项目中粘贴了这个...但实际上我有点着急...当我到家时,我会修改这个答案......