1. 打开sqlite3数据库
SQLITE_API int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
SQLITE_API int sqlite3_open16(
const void *filename, /* Database filename (UTF-16) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
SQLITE_API 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 */
);
参数1filename:指定的sqlites数据库文件;对于sqlite3_open()和sqlite3_open_v2() ,filename参数被解释成UTF-8; 对于sqlite3_open16(),则被解释成UTF-16;
参数2:数据库句柄通过*ppDb返回,即使发生了一些错误;
若sqlite无法分配内存来保存sqlite3对象,*ppDb将被写入NULL,而不是指向sqlite3对象的指针;
返回值:成功打开(创建)数据库,返回SQLITE_OK;否则返回错误代码;可用sqlite3_errmsg()或sqlite3_errmsg16()获取失败后的错误英文描述;
sqlite3_open_v2()接口工作原理类似sqlite3_open(),只是它接收两个附加参数;用于对新的数据库连接进行附加控制;sqlite3_open_v2()的flags参数必须至少包含以下三个标志组合之一;
#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */
除了上述必须的标志,还支持以下可选标志:
#define SQLITE_OPEN_URI 0x00000040 /* 可以将文件名解释为URL */
#define SQLITE_OPEN_MEMORY 0x00000080 /* 数据库将作为内存中的数据库打开 */
#define SQLITE_OPEN_NOMUTEX 0x00008000 /* 允许不同的线程同时使用SQLite,只要每个线程使用不同的数据块连接 */
#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* 多个线程可在同一时间安全的使用同一个数据库连接(互斥锁将阻塞任何实际并发,但在这种模式下,尝试一下没有坏处)*/
#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* 启用共享缓存*/
#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* 数据库被打开并禁用共享缓存*/
sqlite3_open_v2()第四个参数是sqlite3_vfs对象的名称;若为NULL,则使用默认的sqlite3 vfs对象;
2. 关闭数据库
无论打开数据库连接句柄时是否发生错误,但不在需要该句柄时,都应该通过将其传递给sqlite3_close()来释放该数据库连接句柄相关的资源;
调用sqlite3_close()和sqlite3_close_v2()返回SQLITE_OK表示sqlite3对象被成功销毁和所有关联的资源被释放;
理想情况下,应用程序应该尝试关闭sqlite3对象前完成所有准备好的语句,关闭所有BLOB句柄,并完成与sqlite3对象关联的所有sqlite3_backup对象;(a)若数据连接未完成上述情况,那么若调用sqlite3_close()将使数据库连接保持打开并返回SQLITE BUSY;(b) 若数据连接未完成上述情况,那么若调用sqlite3_close_v2()接口,它将返回SQLITE_OK,但不会立即释放数据库连接,而是将数据库连接标记为不可用的"僵尸",等待所有完成后自动释放数据库连接;
如果sqlite3对象在事务打开时被销毁,则事务将自动回滚;
sqlite3_close(C)和sqlite3_close_v2(C)参数C一定要是NULL或者从sqlite3_open(),sqlite3_open16(),或者sqlite3_open_v2()获取的sqlite3对象指针;并且之前没有关闭;