首页 > 解决方案 > sqlite3 - 如何知道读取的行是最后一行

问题描述

我们正在使用sqlite3_prepare_v2andsqlite3_step来执行查询并读取结果。但是,我们需要知道我们获取的行是最后一行,而不执行下一个 sqlite3_step 语句。任何想法?

这样做的原因是特殊的优化要求。为了进一步说明,下面是从表中读取未知行数的代码。我们的代码要求知道最后一条记录,以便采取特殊措施。

从代码中可以看出,我们将最后一个数据发送为 NULL 以将其标记为读取结束。我们这样做是为了直接使用返回的缓冲区,sqlite3_column_blob而不需要任何 malloc/copy。

sqlite3_stmt *statement;
char *data = NULL;

if (sqlite3_prepare_v2(mdb, sql, -1, &statement, NULL) != SQLITE_OK) {
               return -1;
}


while (sqlite3_step(statement) == SQLITE_ROW) {

       data = (char *)sqlite3_column_blob(statement, 0);

       processRecord(data, 0); //data and last row indicator
}

processRecord(NULL, 1); //data and last row indicator

我们想避免发送最后一个 NULL 记录。只有事先知道我们获取的记录是最后一条记录,我们才能做到这一点。

知道如何实现吗?

请注意我们知道我们可以重组代码如下,但它需要我们复制缓冲区和过多的 malloc/copy,因为 sqlite3_step 会破坏以前的数据。这是我们试图避免的,所以请不要建议。

while (sqlite3_step(statement) == SQLITE_ROW) {
       if(data)
           processRecordAndFree(data, 0); 

       data = duplicate_data(sqlite3_column_blob(statement, 0));
}

if(data)
           processRecordAndFree(data, 1); 

标签: csqlite

解决方案


推荐阅读