0

我从使用自定义 Sqlite3 包装器切换到 Delphi XE3 中的 System.Sqlite 单元。

到目前为止,我对结果感到满意,但我不能 100% 确定我是否还应该打电话

...
initialization

  sqlite3_initialize;

finalization

  sqlite3_shutdown;
end.

在我的代码中?

我想真正的问题是

sqlite3.c 是否使用 Windows 3.7.17 发行版中定义的 SQLITE_OMIT_AUTOINIT 编译,可在http://www.sqlite.org/download.html下载?

4

1 回答 1

4

官方文档指出:

SQLITE_OMIT_AUTOINIT

为了向后兼容缺少 sqlite3_initialize() 接口的旧版本 SQLite,在进入某些关键接口(如 sqlite3_open()、sqlite3_vfs_register() 和 sqlite3_mprintf())时会自动调用 sqlite3_initialize() 接口。通过使用 SQLITE_OMIT_AUTOINIT C 预处理器宏构建 SQLite,可以省略以这种方式自动调用 sqlite3_initialize() 的开销。使用 SQLITE_OMIT_AUTOINIT 构建时,SQLite 不会自动初始化,应用程序需要在开始使用 SQLite 库之前直接调用 sqlite3_initialize()。

所以:

  • 默认情况下,此条件未定义;
  • 如果你确定sqlite3_initialize()被调用,你可以定义它;
  • 运行与否不会花费任何性能sqlite3_initialize(),因为初始化检查将在“进入某些关键接口时”执行,即在打开数据库时。

即使sqlite3_initialize()没有被调用也一切正常的事实清楚地表明了这一点。

我们的SQLite3包装器(允许静态或外部链接)中,我们启用此条件,因为我们显式调用sqlite3_initialize(). 但是在官方的dll中,并没有定义这个条件。

于 2013-05-25T05:15:18.187 回答