小巧。快速。可靠。
三选二。

SQLite C 接口

打开一个用于增量 I/O 的 BLOB

int sqlite3_blob_open(
  sqlite3*,
  const char *zDb,
  const char *zTable,
  const char *zColumn,
  sqlite3_int64 iRow,
  int flags,
  sqlite3_blob **ppBlob
);

此接口打开数据库 zDb 中表 zTable 的第 iRow 行、zColumn 列中位于的 BLOB 的句柄;换句话说,就是通过以下语句选择到的同一个 BLOB:

SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;

参数 zDb 不是包含数据库的文件名,而是数据库的符号名称。对于附加的数据库,这是ATTACH 语句中 AS 关键字后出现的名称。对于主数据库文件,数据库名称为“main”。对于 TEMP 表,数据库名称为“temp”。

如果 flags 参数非零,则以读写方式打开 BLOB。如果 flags 参数为零,则以只读方式打开 BLOB。

成功时,返回SQLITE_OK,并将新的BLOB 句柄存储在 *ppBlob 中。否则,返回一个错误代码,并且除非错误代码为 SQLITE_MISUSE,否则 *ppBlob 将设置为 NULL。这意味着,只要 API 未被误用,在该函数返回后,始终可以安全地对 *ppBlob 调用sqlite3_blob_close()

如果以下任何情况为真,则此函数将失败并返回 SQLITE_ERROR

除非返回 SQLITE_MISUSE,否则此函数将设置数据库连接错误代码和消息,可以通过sqlite3_errcode()sqlite3_errmsg() 及相关函数访问。

可以使用sqlite3_blob_read() 接口读取 sqlite3_blob_open() 引用的 BLOB,并使用sqlite3_blob_write() 修改 BLOB。可以使用sqlite3_blob_reopen() 接口将BLOB 句柄移动到同一表中的不同行。但是,在打开BLOB 句柄之后,无法更改BLOB 句柄的列、表或数据库。

如果UPDATEDELETEON CONFLICT 副作用修改了 BLOB 句柄指向的行,则该 BLOB 句柄将被标记为“已过期”。如果行的任何列发生更改,即使是 BLOB 句柄未打开的列,也属于这种情况。对已过期的 BLOB 句柄调用sqlite3_blob_read()sqlite3_blob_write() 将失败并返回SQLITE_ABORT 代码。在 BLOB 过期之前写入 BLOB 的更改不会因 BLOB 过期而回滚。如果事务继续完成,则此类更改最终将提交。

使用sqlite3_blob_bytes() 接口确定已打开的 blob 的大小。此接口无法更改 blob 的大小。使用UPDATE SQL 命令更改 blob 的大小。

可以使用sqlite3_bind_zeroblob()sqlite3_result_zeroblob() 接口以及内置的zeroblob SQL 函数创建零填充的 blob,以便使用增量 blob 接口读取或写入。

为了避免资源泄漏,每个打开的BLOB 句柄最终都应该通过调用sqlite3_blob_close() 来释放。

另请参阅:sqlite3_blob_close()sqlite3_blob_reopen()sqlite3_blob_read()sqlite3_blob_bytes()sqlite3_blob_write()

另请参阅对象常量函数列表。