1,基本信息:sql
1)#include <sqlite3.h>数据库
2)int rc = sqlite3_open(db_name, &db);//不存在会建立文件macos
3)查询后直接返回结果 而不是回调函数
int
sqlite3_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);编码
int
sqlite3_exec ( sqlite3 *db, // 使用 sqlite3_open () 打开的数据库对象。
const char *sql, // 一条待查询的 SQL 语句
sqlite3_callback, // 自定义的回调函数,对查询结果每一行都执行一次这个函数
void *,// 这个void 会直接传递到 callback 中的 void 位置;
char **errmsg//出错信心 能够为空
);spa
其中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 内部对这个作了次封装处理;