2

我正在尝试从 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。

出了什么问题?

4

1 回答 1

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循环。

于 2013-04-21T19:41:45.460 回答