对于sqlite3的一些函数
1、int sqlite3_open(const char * filename, sqlite3 **ppDb)
filename:需要打开的数据库的文件名
ppDb:一个数据库连接句柄被返回到这个参数。即是发生错误,唯一的异常是如果sqlite不能分配内存来存放sqlite对象,ppDb会返回一个NULL值。——跟文件句柄FILE很相似
句柄在很多地方我们见到过,最常见的就是文件的句柄,我们要操作一个文件,我们就要取得一个文件的句柄。
句柄是什么东西呢?
其实很简单,句柄是一个东西的描述,它被定义为一个结构体,这个结构会包含这个东西的具体信息,比图位置,大小,类型。我们有了这个描述信息就能去找到这个东西
返回值是什么?
返回值int是成果返回SQLITE_OK,也就是0,错误返回其他值。
打开之后,如果需要继续操作,要在数据库中建立表,涉及到一个函数sqlite3_exec()
2、sqlite3_exec()执行非查询的sqlite3语句
int sqlite3_exec(
sqlite3 *ppDb, //an open database open函数中返回的数据库句柄
const char *sql, //SQL to bei evalutated 执行的sql语句
sqlite_callback // callback 回调功能
void *para, // 1st argument to callback 用户传入的参数,可以为NULL,该参数最后被传入回调函数以便在回调函数里使用
char **errMsg //errMsg write here返回错误信息,注意是指针的指针
);
exec()接口执行0或者多个UTF-8编码的,分号分割的sql语句,传到第二个参数中,
如果sqlite3_exec的第三个函数指针不为空,他会为每个来自执行的SQL语句行调用(也就是说回调函数会调用多次,上面例子中会返回2个结果行,因而会执行2次),
第4个参数是传给调函数的第一个参数。
如果回调函数指针为空,那么回调不会发生,同时结果行被忽略
如果在执行sql语句的时候有错误发生,那么当前的语句的执行被停止,后续的语句也被跳过。
第五个参数不为空的时候,它被分配内存并写入了错误信息,所以在sqlite3_exec后面要调用sqlite3_free去释放这个对象防止内存泄露。
4、回调函数
typedef int (*sqlite_callback)(
void *para, //输入参数para,从sqlite3_exec()传入的参数制作
int columnCount, //表的列数
char **columnValue, //指向查询结果的指针数组
char **columnName //指向表头明的指针数据
);
参数格式:传给sqlite3_exec的回调函数,用来显示查询结果
对没一条查询结果调用该函数
参数para:由sqlite3_exec传递的初始化函数
columnCount表的列数
coloumnValue:表头的列数
cololumnName:指向表头的数组指针
返回值:
1:中断查找
0:继续例举查询的数据
int LoadMyInfo(void *para,char *ncolumn,char **columnvalue,char **columnname)
{
//para是你在sqlite3_exec例传入的void *参数
//通过para参数,你可以传入一些特殊的指针(比如类指针、结构指针),然后再这里面强制转换成对应的类型(这里是void *类型,必须强制转换成你的类型才可用)
//ncolumn是这一条记录有多少个字段
//columnvalue是关键值,查出来的数据都保存在这里,实际上是一个1维数组,每个元素都是char *类型
//columnname与columnvalue对应
//这里我不适用para参数,忽略它的存在
int i;
printf("total column %d",ncolumn);
for(i = 0;i < ncolumn;i++)
{
printf("columnname:%s columnvalue:%s\n",coumnname[i],columnvalue[i]);
}
printf("-------------------------------------\n");
return 0;
}
示例表:
id pic data
1 a.jpg 00 00 00
2 b.jpg xx xx xx
对第一行数据:argc = 3,即[0]...[2]
argv[0] = "0", agrv[1] = "a.jpg",argv[2] = "00 00 00 .."
col[0] = "id",col[1] = "pic",col[2] = "data"
说明:sqlite3_exec()的回调函数必须按照此格式,当然形参的名字任意。
例子:
打开数据库成功后,创建了mytable_1。
使用
result = sqlite3_exec(db,"insert into mytable_1(name)Values('走路'),NULL,NULL,&errmsg");
result = sqlite3_exec(db,"insert into mytable_1(name)Values('汽车'),NULL,NULL,&errmsg");
result = sqlite3_exec(db,"insert into mytable_1(name)Values('乘车'),NULL,NULL,&errmsg");
最后用
result = sqlite3_exec(db,"select *from mytable_1",LoadMyInfo,NULL,errmsg);
查询表的内容
每查询一次,调用一次,里面有三条记录,就会调用3次。
sqlite3_exec是使用回调来执行对select结果的操作。还有一个方法直接查询不需要回调。我个人感觉还是回调号,因为代码可以更加整齐,只不过回调很麻烦,你得声明一个函数,
3、sqlite3_get_table(
sqlite3 *db, //an open database
const char *sql, //SQL to be evaluated
char ***azresult, //result of the query 查询结果,依然是一维数组。(不要以为是二维数组或者三维)内存布局是:字段名称,后面紧接着是每个字段的值
char *nrow, //number of result rows written here 查询出多少条记录
char *ncolumn, //number of columns written here 查询出多少个字段
char **errmsg, //error msg written here 错误信息
)
azresult返回的字符数量实际上是(*nrow + 1)*(*ncolumn),因为前面有字段名
void sqlite3_free_table(char **result);
所以显示全部数据有两个做法:
①不调用回调函数
sqlite3_get_table(sqlite3 *db,const char *sql,char ***azresult,char *n row,char *ncolumn,char **errmsg );
②调用回调函数