天天看点

SQLite3学习

1,关于版本号 编译阶段,字符串版本号:SQLITE_VERSION="X.Y.Z";

X为主版本号,Y为次版本号,Z为发布版本号;

版本字符串后一般跟随:alpha或者beta 编译阶段,数值型版本号:SQLITE_VERSION_NUMBER=3003007

一般公式为:X*100000+Y*1000+Z 运行阶段,字符串版本号:const char* sqlite3_version();

运行阶段,数值型版本号:int sqlite3_libversion_number(); 2,数据库接口 typedef struct sqlite3 sqlite3;

学习中将定义一个新的类型

typedef sqlite3* HDB; 3,64位长整类型 有些编译器不支持标准64位长整型long long int

微软用__int64/unsigned __int64

这儿内部定义一个:sqlite_int64/sqlite_uint64

学习中将定义一个新的类型

typedef sqlite_int64 i64;

typedef sqlite_uint64 u64;

4,数据库关闭 int sqlite3_close(sqlie3*); 如果返回代码为SQLITE_BUSY,则数据库仍旧打开着

原因是语句准备(sqlite3_prepare)没有释放掉(sqlite3_finalize) 5,回调函数及运行函数 typedef int (*sqlite3_callback)(void*,int,char**,char**); int sqlite3_exec(sqlite3*,const char*,sqlite3_callback,void*,char**); 运行函数一次可以执行一至多个SQL语句 运行函数的第2个参数是SQL语句,如果它包括一至多个select,

运行中每得到一个数据,运行函数第三个参数回调函数将执行,

一般在这个回调中,你应该返回0,如果你返回一个非零值,

则这个select将被中断,并且接下来的其它SQL语句都将被忽略,

运行函数将返回SQLITE_ABORT 第4个参数是个随意指针,用途可用户指定,它将传给回调函数的第1个参数

回调函数第2个参数代表数据结果集中有几列数据,

第3个参数代表列数据的字符串数组,第4个参数代表列名的字符串数组 运行函数中可以指定一个空回调,它并不是一个错误,仅代表不执行回调 运行函数在分析与评估SQL语句且还未执行回调函数时发出一错误,

运行函数将分配适当的堆内存并在其中写入错误信息,错误信息用第5参数返回,

注意你必须用sqlite3_free释放它,如果第5参数为空,运行函数将忽略错误信息。 运行函数成功后,将返回SQLITE_OK,其它错误将依据相应的错误代码 如果数据库文件被锁定或者很忙,则运行函数将返回SQLITE_BUSY

这个行为可以通过使用sqlite3_busy_handler()与sqlite3_busy_timeout改变 6,数据库运行函数sqlite3_exec()与单步运行函数sqliet3_step()的返回值 SQLITE_OK/0 成功执行

SQLITE_ERROR/1 SQL错误或数据库不存在

SQLITE_INTERNAL/2 SQLite内部逻辑错误(没有使用)

SQLITE_PERM/3 访问许可禁止

SQLITE_ABORT/4 回调函数请求中止

SQLITE_BUSY/5 数据库文件被锁定

SQLITE_LOCKED/6 数据库中的一表被锁定

SQLITE_NOMEM/7 malloc()分配堆失败

SQLITE_READONLY/8 企图写只读数据库

SQLITE_INTERRUPT/9 操作被sqlie3_interrupt()中止

SQLITE_IOERR/10 磁盘I/O错误

SQLITE_CORRUPT/11 数据库文件变形

SQLITE_NOTFOUND/12 表或纪录没有找到(没有使用)

SQLITE_FULL/13 插入失败因为数据库满

SQLITE_CANTOPEN/14 不能打开数据库文件

SQLITE_PROTOCOL/15 数据库锁协议错误

SQLITE_EMPTY/16 数据库是空的

SQLITE_SCHEMA/17 数据库模式改变

SQLITE_TOOBIG/18 单行数据过多(没有使用)

SQLITE_CONSTRAINT/19 因约束违背而中止

SQLITE_MISMATCH/20 数据类型不匹配

SQLITE_MISUSE/21 库使用方法不当

SQLITE_NOLFS/22 主机不支持库中操作系统功能

SQLITE_AUTH/23 认证禁止

SQLITE_FORMAT/24 附属数据库格式错误

SQLITE_RANGE/25 sqlite3_bind()第2个参数超出范围

SQLITE_NOTADB/26 打开非数据库文件

SQLITE_ROW/100 sqlite3_step()有另一行数据就绪

SQLITE_DONE/101 sqlite3_step()完成执行,已无数据 7,上一次主键值 sqlite_int64 sqlite3_last_insert_rowid(sqlite3*); 如果表中的主键生效:integer primary key

则这个函数返回的值是确定的,否则将是随机的 8,改变的行数 int sqlite3_changes(sqlite3*); 它将返回数据库最近一次运行sqlite3_exec()所改变的行数(插入或删除)

就算是在事务中回滚rollback中止abort,这些改变都被计数

除非创建表或删除表,这时将不会计数,一般是返回0 在sqlite3_exec()回调中,改变数在sqlite3_exec内部统计,

sqlite3_exec返回后将合计这引起改变数 SQLite对没有where子句的SQL语句"delete from table"实现是这样的:

直接删除表,然后重新表,这样做主要是为了提高效率,

没有where子句的"delete from table"的改变数将返回0

如果你确实需要改变数,请使用"delete from table where 1" int sqlite3_total_changes(sqlite3*); 这个函数将返回返数据库打开以来所有的insert,delete,update所改变的行数,

触发器中的insert,delete,update也统计在内,但要注意上文的删除所有数据的实现。 9,运行中断 void sqlite3_interrupt(sqlite3*); 在任何数据库运行操作期间,运行这个函数将ABORT数据库运行,

数据库也会寻找最佳良机返回。一般在很长时间的查询中,

用户等得不耐烦了,可以用它中止查询, 10,简单的语句完整性 int sqlite3_complete(const char*);

int sqlite3_complete16(const void*); 前一个是UTF-8版本,后一个是UTF-16版本

如果是一至多个完整的SQL语句,它们将返回true(不知能否当BOOL用)

它的实现策略很简单:最后一个标记只能是空白符或分号