1,基本信息:
1)#include <sqlite3.h>
2)int rc = sqlite3_open(db_name, &db);//不存在会创建文件
3)查询后直接返回结果 而不是回调
intsqlite3_get_table (sqlite3 *, // 打开的数据库对象指针 const char * sql, // 要查询的 sql 语句 char *** resultp, // 查询结果 int * nrow, // 查询出多少条记录(即查出多少行) int * ncolumn, // 多少个字段(多少列) char ** errmsg // 错误信息);
4)sqlite3_close(sqlite3 *db);
5)sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg);
intsqlite3_exec ( sqlite3 *db, // 使用 sqlite3_open () 打开的数据库对象。 const char *sql, // 一条待查询的 SQL 语句 sqlite3_callback, // 自定义的回调函数,对查询结果每一行都执行一次这个函数 void *,// 这个void 会直接传递到 callback 中的 void 位置; char **errmsg//出错信心 可以为空);
其中sqlite3_callback 是一个 函数指针;
定义为:
typedef int(*sqlite3_callback) (void *, // 这就是上面函数传递的 void * 参数,需要强制类型转换后才能使用。 int, // 查询结果的列数,即有多少个字段数 char **, // 保存查询结果 char ** // 各个字段的名字);
6)sqlite3_free_table( dbResult );
2, 对于查询数据 可以使用getTable 也可以使用回调方式的 execute;
3,获取数据库中的表名: 注意 一个db 文件中可能包含多个table(方法待验证)
char
*szError = NULL,**dbResult;
int
row,col;
int
result = sqlite3_get_table( db,
"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"
,&dbResult,&row,&col,&szError );
if
( result == SQLITE_OK )
{
//dbResult就是查询结果,row和col分别是返回结果集的行数(包含表头)和列数
sqlite3_free_table(dbResult);
}
else
{
//szError是错误描述信息
sqlite3_free(szError);
}
4,查询 表中 的 字段名; 已经验证; 网上查到的方法 都存在一些问题,比如当 表 内容为空时,查询字段名称失败;还是通过查看官方文档解决了问题;
sql = "select * from table_name";
//预处理 rc = sqlite3_prepare(db, sql, (int)strlen(sql), &stmt, &tail);if(rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); } //rc = sqlite3_step(stmt); [亲测: no need to step] ncols = sqlite3_column_count(stmt);//[tested , got real count]//[tested , colum names are printed out] for(i=0; i < ncols; i++) { fprintf(stderr, "'%s' ", sqlite3_column_text(stmt, i)); }
fprintf(stderr, "\n");
//释放statement sqlite3_finalize(stmt); //关闭数据库 // sqlite3_close(db); [you can choose not to close]
return 0;
5,运行阶段: 环境 macos XCode ;
编译直接报错;各种sqlite3 函数找不到
猜测是编译链接问题; 果断导入 sqlite3包后 编译成功;
6,刚才(PM 10:31 ,2015.03.16;) 封装的sqlite 工具库 已经调试完成; 插入,删除,更新数据,打印数据都已经成功;
但是目前还是有一点困惑:
1)字段中存在 integer 类型;
2)查询返回值中返回的类型 是 char**
3) 插入语句是 insert into tb_name values ( 5 , 788 , "stt"); 这条语句是 存储在char[]
那么问题来了:
integer 5, 写入到char[]中时候 应该怎么写?
a) 我先使用 int* 砖 char* 方式 ,仍然占用4 个字节 拷贝进来 ,但是 sqlite 报错;
b) 使用int 转字符串 即 5 转为 ‘5’, 方式, 工作正常;
问题是: 我一直认为 在bd 中 的integer 存储的 integer 字段 , 使用的是 如 int 类型 在内存中一样;例如1 ,应当占4个字节,而不是如‘1’ 只占了一个字节;
还请指正我错误的地方。
谢谢;
经过测试,我推测:在查询语句中 的integer 仍然应当使用 相应的ASC码值,而在数据库文件中 仍然将采用整型 数据格式存储。应当是 sqlite 内部对这个做了次封装处理;
NULL: 这个值为空值
VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。
CHAR(n):长度固定为n的字串,n不能超过 254。
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改 变格式。
DATA :包含了 年份、月份、日期。
TIME: 包含了 小时、分钟、秒。