sqlite3_exec回调是同步还是异步的?

11

Sqlite3函数sqlite3_exec()带有回调参数,它是同步运行还是异步运行?

示例调用:

int retStatus = sqlite3_exec(pDB, "SELECT * FROM SomeTable WHERE Something='Hi'", callback, &object, &error);

...Next line(s) of code...
  • 同步:执行sqlite3_exec语句,然后调用回调函数,再执行下一行或多行代码。

  • 异步:执行sqlite3_exec语句,然后执行下一行或多行代码,直到某个时间点回调函数被调用。

1个回答

13

同步。在代码继续执行之前,对每个找到的行调用回调函数:

static int _getName(void* pNames, int columns, char** data, char** columnNames)
{
    if (columns < 2)
    {
        assert(false && "Function called on wrong table!");
        // Signify failure
        return 1;
    }
    std::vector<std::string>* vNames = static_cast< std::vector<std::string>* >(pNames);
    vNames->push_back(data[1]);
    // Success:
    return 0;
}

{
    std::vector<std::string> names;
    // assume pDB is a valid, opened sqlite3* db
    char* error = 0;
    if (sqlite3_exec(pDB, "SELECT * FROM TableNames", _getName, static_cast<void*>(&names), &error) != SQLITE_OK)
    {
        // log and free error:
    }

    assert(names.size() && "No entries were found in the table");
}

_getName 会被调用以处理在表格 TableNames 中找到的每个条目。如果没有找到任何条目,则不会调用该函数,也不会出现错误。如果您有一个名为 TableNames 的表,并且其中有10个条目,则 names.size() == 10_getName 如果返回非零值,则不再被调用。


这并不完全是我的问题。我的问题是在sqlite3_exec调用和回调调用之间是否会执行某些操作 - 我可以相信在最后一个查询项的最后一个回调之前不会执行任何单个程序步骤... - Mendes
@Mendes:你找到答案了吗?谢谢。我认为它是同步的,因为在大多数示例中,在执行完之后调用sqlite3_close()函数。 - Han
3
它是同步的。 - Mendes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接