即使table为空,SQLite step()也会返回SQLITE_ROW

时间:2013-04-21 19:09:45

标签: ios sqlite

我正在尝试从SQLite中的表中获取行:

_tempPath = [[NSSearchPathForDirectoriesInDomains
                            (NSDocumentDirectory, NSUserDomainMask, YES)
                            objectAtIndex:0] stringByAppendingPathComponent:@"test.db"];

sqlite3         *pHandle;
sqlite3_stmt    *pStatementHandle;

NSLog(@"OPEN: %i ", sqlite3_open([_tempPath UTF8String], &pHandle));

const char *query = "select * from Transactions";

NSLog(@"PREP: %i", sqlite3_prepare (pHandle, query, -1, &pStatementHandle, NULL));

while(sqlite3_step(pStatementHandle) != SQLITE_DONE);
{
    NSLog(@"ROW");
}

sqlite3_finalize(pStatementHandle);

sqlite3_close(pHandle);

但是,我总是得到一个空行。表格是空的还是没有条目,这一点无关紧要。

open()和prepare()命令返回SQLITE_OK。

出了什么问题?

1 个答案:

答案 0 :(得分:3)

问题是你在while语句的末尾有一个分号,因此你的代码在while循环中什么都不做,然后只会将NSLog("ROW");视为某种东西它将在while循环完成时执行。因此,您的代码:

while (sqlite3_step(pStatementHandle) != SQLITE_DONE);
{
    NSLog(@"ROW");
}

等同于:

while (sqlite3_step(pStatementHandle) != SQLITE_DONE)
{
    // do nothing
}

{
    NSLog(@"ROW");
}

顺便说一句,你真的应该看sqlite3_step返回码,如果不是SQLITE_ROWSQLITE_DONE,则显示错误(如果有的话)。因此你的循环:

while (sqlite3_step(pStatementHandle) != SQLITE_DONE);
{
    NSLog(@"ROW");
}

应该是:

int rc;
while ((rc = sqlite3_step(pStatementHandle)) == SQLITE_ROW) // note, no ";"
{
    NSLog(@"ROW");
}

if (rc != SQLITE_DONE)
    NSLog(@"%s: step error: %d: %s", __FUNCTION__, rc, sqlite3_errmsg(pHandle));

在原始版本中,如果您遇到错误,则永远不会退出while循环。