gpt4 book ai didi

ios - SQLite step() 即使表为空也返回 SQLITE_ROW

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:10:28 24 4
gpt4 key购买 nike

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

出了什么问题?

最佳答案

问题是你在 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 循环。

关于ios - SQLite step() 即使表为空也返回 SQLITE_ROW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16135109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com