SQLite C 接口
打开一个新的数据库连接
int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open16( const void *filename, /* Database filename (UTF-16) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open_v2( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb, /* OUT: SQLite db handle */ int flags, /* Flags */ const char *zVfs /* Name of VFS module to use */ );
这些例程打开由文件名参数指定的 SQLite 数据库文件。文件名参数被解释为 sqlite3_open() 和 sqlite3_open_v2() 的 UTF-8 以及 sqlite3_open16() 的本机字节顺序中的 UTF-16。数据库连接句柄通常在 *ppDb 中返回,即使发生错误也是如此。唯一的例外是,如果 SQLite 无法分配内存来保存sqlite3对象,则会将 NULL 写入 *ppDb 而不是指向sqlite3 对象的指针。如果数据库成功打开(和/或创建),则 返回SQLITE_OK。否则返回错误代码。sqlite3_errmsg ( )或sqlite3_errmsg16()例程可用于在任何 sqlite3_open() 例程失败后获取错误的英语描述。
对于使用 sqlite3_open() 或 sqlite3_open_v2() 创建的数据库,默认编码将为 UTF-8。使用 sqlite3_open16() 创建的数据库的默认编码将是本机字节顺序的 UTF-16。
无论打开时是否发生错误,与数据库连接句柄关联的资源都应在不再需要时通过将其传递给sqlite3_close()来释放。
sqlite3_open_v2() 接口的工作方式与 sqlite3_open() 类似,只是它接受两个附加参数以对新数据库连接进行额外控制。sqlite3_open_v2() 的标志参数必须至少包括以下三个标志组合之一:
- SQLITE_OPEN_READONLY
- 数据库以只读模式打开。如果数据库尚不存在,则返回错误。
- SQLITE_OPEN_READWRITE
- 如果可能,打开数据库以进行读写,或者仅在文件被操作系统写保护时才进行读取。在任何一种情况下,数据库都必须已经存在,否则将返回错误。
- SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
- 数据库以读写方式打开,如果不存在则创建。这是始终用于 sqlite3_open() 和 sqlite3_open16() 的行为。
除了必需的标志外,还支持以下可选标志:
- SQLITE_OPEN_URI
- 如果设置了此标志,则文件名可以解释为 URI。
- SQLITE_OPEN_MEMORY
- 该数据库将作为内存数据库打开。如果启用了共享缓存模式,则数据库由“文件名”参数命名,用于缓存共享,但“文件名”将被忽略。
- SQLITE_OPEN_NOMUTEX
- 新的数据库连接将使用“多线程” 线程模式。这意味着允许单独的线程同时使用 SQLite,只要每个线程使用不同的数据库连接即可。
- SQLITE_OPEN_FULLMUTEX
- 新的数据库连接将使用“序列化” 线程模式。这意味着多个线程可以安全地同时尝试使用同一个数据库连接。(互斥量会阻止任何实际的并发,但在这种模式下尝试并没有坏处。)
- SQLITE_OPEN_SHAREDCACHE
- 数据库打开时启用共享缓存,覆盖sqlite3_enable_shared_cache()提供的默认共享缓存设置 。
- SQLITE_OPEN_PRIVATECACHE
- 数据库打开共享缓存禁用,覆盖sqlite3_enable_shared_cache()提供的默认共享缓存设置 。
- SQLITE_OPEN_EXRESCODE
- 数据库连接以“扩展结果代码模式”出现。换句话说,数据库的行为有 if sqlite3_extended_result_codes(db,1)一旦连接被创建就调用数据库连接。除了设置扩展结果代码模式外,该标志还导致sqlite3_open_v2() 返回扩展结果代码。
- SQLITE_OPEN_NOFOLLOW
- 数据库文件名不允许是符号链接
如果 sqlite3_open_v2() 的第三个参数不是上面显示的必需组合之一,可以选择与其他 SQLITE_OPEN_* 位组合, 则行为未定义。SQLite 的历史版本已经默默地忽略了 sqlite3_open_v2() 的 flags 参数中的多余位,但是这种行为可能不会延续到 SQLite 的未来版本中,因此应用程序不应依赖它。特别注意 SQLITE_OPEN_EXCLUSIVE 标志是 sqlite3_open_v2() 的空操作。如果数据库已经存在,SQLITE_OPEN_EXCLUSIVE *不会*导致打开失败。SQLITE_OPEN_EXCLUSIVE 标志仅供VFS 接口使用,而不供 sqlite3_open_v2() 使用。
sqlite3_open_v2() 的第四个参数是 sqlite3_vfs对象的名称,它定义了新数据库连接应该使用的操作系统接口。如果第四个参数是 NULL 指针,则使用默认的sqlite3_vfs对象。
如果文件名为“:memory:”,则会为连接创建一个私有的临时内存数据库。当数据库连接关闭时,这个内存数据库将消失。SQLite 的未来版本可能会使用以“:”字符开头的其他特殊文件名。建议当数据库文件名确实以“:”字符开头时,您应该在文件名前加上路径名(例如“./”)以避免歧义。
如果文件名是空字符串,则会创建一个私有的临时磁盘数据库。一旦数据库连接关闭,这个私有数据库就会自动删除。
URI 文件名
如果启用URI 文件名解释,并且文件名参数以“file:”开头,则文件名被解释为 URI。如果在 sqlite3_open_v2() 的第三个参数中设置了SQLITE_OPEN_URI标志,或者如果使用带有sqlite3_config()方法的SQLITE_CONFIG_URI选项 或通过SQLITE_USE_URI编译时选项全局启用它,则启用 URI 文件名解释。URI 文件名解释默认关闭,但 SQLite 的未来版本可能默认启用 URI 文件名解释。有关其他信息,请参阅“ URI 文件名”。
URI 文件名根据 RFC 3986 进行解析。如果 URI 包含权限,则它必须是空字符串或字符串“localhost”。如果 authority 不是空字符串或“localhost”,则向调用者返回错误。URI 的片段组件(如果存在)将被忽略。
SQLite 使用 URI 的路径部分作为包含数据库的磁盘文件的名称。如果路径以“/”字符开头,则它被解释为绝对路径。如果路径不以“/”开头(意味着授权部分从 URI 中省略),则该路径被解释为相对路径。在 Windows 上,绝对路径的第一个组成部分是驱动器说明(例如“C:”)。
URI 的查询组件可能包含由 SQLite 本身或自定义 VFS 实现解释的参数。SQLite 及其内置的VFSes解释以下查询参数:
- vfs:“vfs”参数可用于指定 VFS 对象的名称,该对象提供用于访问磁盘上的数据库文件的操作系统接口。如果此选项设置为空字符串,则使用默认 VFS 对象。指定未知的 VFS 是错误的。如果使用 sqlite3_open_v2() 并且存在 vfs 选项,则该选项指定的 VFS 优先于作为第四个参数传递给 sqlite3_open_v2() 的值。
- mode:模式参数可以设置为“ro”、“rw”、“rwc”或“memory”。试图将其设置为任何其他值都是错误的。如果指定了“ro”,那么数据库将以只读方式打开,就像在 sqlite3_open_v2() 的第三个参数中设置了SQLITE_OPEN_READONLY标志一样。如果 mode 选项设置为“rw”,则打开数据库进行读写(但不是创建)访问,就好像设置了 SQLITE_OPEN_READWRITE(但不是 SQLITE_OPEN_CREATE)一样。值“rwc”相当于同时设置 SQLITE_OPEN_READWRITE 和 SQLITE_OPEN_CREATE。如果模式选项设置为“内存”,那么一个纯内存数据库使用从不从磁盘读取或写入的。为 mode 参数指定一个比第三个参数中传递给 sqlite3_open_v2() 的标志指定的限制更少的值是错误的。
- cache:缓存参数可以设置为“共享”或“私有”。将其设置为“共享”相当于在传递给 sqlite3_open_v2() 的标志参数中设置 SQLITE_OPEN_SHAREDCACHE 位。将缓存参数设置为“private”等同于设置 SQLITE_OPEN_PRIVATECACHE 位。如果使用 sqlite3_open_v2() 并且 URI 文件名中存在“缓存”参数,则其值将覆盖通过设置 SQLITE_OPEN_PRIVATECACHE 或 SQLITE_OPEN_SHAREDCACHE 标志请求的任何行为。
- psow: psow 参数表示 powersafe 覆盖属性是否适用于数据库文件所在的存储介质。
- nolock: nolock 参数是一个布尔查询参数,如果设置它会在回滚日志模式下禁用文件锁定。这对于访问不支持锁定的文件系统上的数据库很有用。警告:如果两个或多个进程写入同一个数据库并且其中任何一个进程使用 nolock=1,则可能会导致数据库损坏。
- immutable:不可变参数是一个布尔查询参数,表示数据库文件存储在只读介质上。当设置了 immutable 时,SQLite 假定数据库文件无法更改,即使是具有更高权限的进程,因此数据库以只读方式打开,所有锁定和更改检测都被禁用。警告:在实际上发生变化的数据库文件上设置不可变属性可能会导致不正确的查询结果和/或SQLITE_CORRUPT错误。另请参阅:SQLITE_IOCAP_IMMUTABLE。
在 URI 的查询组件中指定未知参数不是错误。SQLite 的未来版本可能会理解额外的查询参数。有关其他信息,请参阅“对 SQLite 具有特殊含义的查询参数”。
URI 文件名示例
URI filenames | Results |
---|---|
file:data.db | Open the file "data.db" in the current directory. |
file:/home/fred/data.db file:///home/fred/data.db file://localhost/home/fred/data.db | Open the database file "/home/fred/data.db". |
file://darkstar/home/fred/data.db | An error. "darkstar" is not a recognized authority. |
file:///C:/Documents%20and%20Settings/fred/Desktop/data.db | Windows only: Open the file "data.db" on fred's desktop on drive C:. Note that the %20 escaping in this example is not strictly necessary - space characters can be used literally in URI filenames. |
file:data.db?mode=ro&cache=private | Open file "data.db" in the current directory for read-only access. Regardless of whether or not shared-cache mode is enabled by default, use a private cache. |
file:/home/fred/data.db?vfs=unix-dotfile | Open file "/home/fred/data.db". Use the special VFS "unix-dotfile" that uses dot-files in place of posix advisory locking. |
file:data.db?mode=readonly | An error. "readonly" is not a valid option for the "mode" parameter. Use "ro" instead: "file:data.db?mode=ro". |
URI 的路径和查询组件支持 URI 十六进制转义序列 (%HH)。十六进制转义序列由一个百分号 - “%” - 后跟两个指定八位位组值的十六进制数字组成。在解释 URI 文件名的路径或查询组件之前,它们使用 UTF-8 编码,所有十六进制转义序列替换为包含相应八位组的单个字节。如果此过程生成无效的 UTF-8 编码,则结果未定义。
Windows 用户注意: 用于 sqlite3_open() 和 sqlite3_open_v2() 的文件名参数的编码必须是 UTF-8,而不是当前定义的任何代码页。包含国际字符的文件名在传递到 sqlite3_open() 或 sqlite3_open_v2() 之前必须转换为 UTF-8。
Windows 运行时用户请注意: 必须在调用 sqlite3_open() 或 sqlite3_open_v2() 之前设置临时目录。否则,需要使用临时文件的各种功能可能会失败。