我正在尝试从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。
出了什么问题?
答案 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_ROW
或SQLITE_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
循环。