ios - sqlite3_step 总是返回 SQLITE_DONE

标签 ios xcode sqlite

我正在尝试从单个表 sqlite 数据库中检索数据,但是 (sqlite3_step(statement) == SQLITE_ROW) 总是返回 false。我已经手动检查了数据库中的值并且它们存在。这是完整的代码:

-(NSArray *)findByPartNumber:(NSString *)partNumber
{
    const char *dbpath = [databasePath UTF8String];
    NSMutableArray *resultArray = [[NSMutableArray alloc] init];
    if(sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        NSString *querySQL = [NSString stringWithFormat:@"SELECT Description, ListPrice FROM PriceList WHERE PartNumber=?"];
        const char *query_stmt = [querySQL UTF8String];
        if(sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
            sqlite3_bind_text(statement, 1, [partNumber UTF8String], -1, SQLITE_STATIC);
            if(sqlite3_step(statement) == SQLITE_ROW)
            {
                NSString *description;
                NSString *listPrice;

                const char *tmp1 = (const char *)sqlite3_column_text(statement, 0);
                const char *tmp2 = (const char *)sqlite3_column_text(statement, 1);

                if(tmp1 == NULL)
                    description = nil;
                else
                {
                    description = [[NSString alloc] initWithUTF8String:tmp1];
                    [resultArray addObject:description];
                }
                if(tmp2 == NULL)
                    listPrice = nil;
                else
                {
                    listPrice = [[NSString alloc] initWithUTF8String:tmp2];
                    [resultArray addObject:listPrice];
                }
                sqlite3_finalize(statement);
            }
        }
        sqlite3_close(database);
    }

    if([resultArray count] == 0)
        return nil;
    else
        return resultArray;
}

代码进入 sqlite3_prepare_v2 block ,但跳过 sqlite3_step block 。我错过了什么吗?

最佳答案

您的实现存在问题。

你写过这样的:

sqlite3_bind_text(statement, 1, [partNumber UTF8String], -1, SQLITE_STATIC);
if(sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
   ...
}

您只能将值绑定(bind)到准备好的语句,因此将上面的代码更改为:
if(sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
   sqlite3_bind_text(statement, 1, [partNumber UTF8String], -1, SQLITE_STATIC);
   ...
}

关于ios - sqlite3_step 总是返回 SQLITE_DONE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26859366/

相关文章:

ios - 屏蔽 UIImageView 不起作用

ios - 无法在build设置中找到 LLVM6.0 以添加 .pch 前缀 header

ios - 如何使用 Google Places API 获取某个地点的位置坐标?

ios - 将 iOS8 及更高版本的设备与 Xcode 一起使用

swift - 如何在代码中创建 SceneKit SCNSkinner 对象?

android - 可以依赖 SQLiteConstraint 并让 SQLite 为我进行检查吗?有陷阱吗?

java - 将整数值保存到数据库中

javascript - 我怎样才能减少expo build ios的大小,它大约是188 MB,

iphone - 导航栏仅在4英寸处可见

python - 如何将 sqlite 3.8.2 升级到 >= 3.8.3