开发者学堂课程【嵌入式之 RFID 开发与应用2020版:SQLite 数据库编程回调方式获取数据表信息】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11236
SQLite 数据库编程回调方式获取数据表信息
SQLite数据库编程回调方式获取数据表信息
一般是使用编程,使用语句操作是为了编程而如此操作。
首先是创建一个表,在代码中就不再创建表,其实在代码中创建时一样的,但是不能重复创建,直接操作已有的 stu.Db 表
sqlite> select * from info;
id name addr time date
---- -------- ------- -------- -------
119 yy bj
102 ls tj
110 ww sh
104 zs cd
105 xw cq
107
108 xx ty 08:01:40 2020-04-28
创建代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "sqlite3. h"
int main (int argc, char **argv)
{
/定义句柄并将地址传入
Sqlite3 *db=null
Int ret;char *err=null;
Ret=sqlite3_open ("stu.dp" ,&db) ;
/对结果进行判断
ret =sqliste3_open( " stu. db" , &db) ;
if (ret != SQLITE_OK) {
printf ( "open error\n " );
return -1;
}
/定义指针 err,将错误信息传入
sqlite3_exec(db , sql ,NULL,NULL, &err);
如果指针为 null,无错误;如果不为空,打印错误
if(err){
printf ( "err : %s \n" ,err) ;
}
sqlite3_close (db ) ;
return 0;
}
现在关键是如何打开数据库,需要定义指针,数组不容易赋值,数组要在定义时就要完成赋值,否则就只能copy值。
Sql 指针可以指向任何一个字符串
{
Sqlite3 *db=null
Int ret;char *err=null;
Char *sql;
Ret=sqlite3_open ("stu.dp" ,&db) ;
ret =sqliste3_open( " stu. db" , &db) ;
if (ret != SQLITE_OK) {
printf ( "open error\n " );
return -1;
}
/执行插入操作
sql ="insert into info
values(120,’zz’,’ts’,time(‘now’)) " ;
sqlite3_exec(db , sql ,NULL,NULL, &err);
if(err){
printf ( "err : %s \n" ,err) ;
}
sqlite3_close (db ) ;
return 0;
}
在窗口编写代码;
edu@edu : sqlite$ make
gcc -c example.c -o example.o -wall
gcc example.o sqlite3.o -o example -wall -lpthread -ldl
edu@edu : sqlite$make
gcc -c example.c -o example.o -Wall
gcc example.o sqlite3.o -o example -wall -lpthread -ldl
edu@edu : sqlite$ ./example
进行查看:
sqlite> select * from info;
id name addr time date
---- -------- ------- -------- -------
119 yy bj
102 ls tj
110 ww sh
104 zs cd
105 xw cq
107
108 xx ty 08:01:40 2020-04-28
120 zz ts 09:55:00 2020-04-28
表示刚新增的信息完成,相当于两个进程同时操作这个数据库,一边是通过命令行操作,一边是通过编写的程序操作
在很多时候是在进行查询操作,更改代码:
/回调函数
int loadinfo (void *data,int col, char **val , char **name)
{
/在回调函数中,打印参数是否等于%的的 \n
printf ( "arg = %d\n ",*(int *) data) ;
printf ( " col = %d \n" ,col);
return SQLITE_OK;
}
int main (int argc , char **argv)
{
Sqlite3 *db=null
Int ret;char *err=null;
Char *sql;int arg=33;
Ret=sqlite3_open ("stu.dp" ,&db) ;
ret =sqliste3_open( " stu. db" , &db) ;
if (ret != SQLITE_OK) {
printf ( "open error\n " );
return -1;
}
sql ="select * from info;" ;
/将回调函数传入
sqlite3_exec(db , sql ,loadinfo,&arg &err);
if(err){
printf ( "err : %s \n" ,err) ;
}
sqlite3_close (db ) ;
return 0;
}
验证是否能跑通:
edu@edu : sqlite$make; ./example
gcc -c example.c -o example.o -wall
gcc example.o sqlite3.o -o example -wall -lpthread -ldl
arg = 33
col = 5
arg = 33
col = 5
arg = 33
col = 5
arg = 33
col = 5
arg = 33
col = 5
arg = 33
col = 5
arg = 33
col = 5
arg = 33
col = 5
arg = 33
col = 5
传过去的参数是 33,打印了多次 5 行,以方法不方便查看传了多少次,所以:
int loadinfo (void *data,int col, char **val , char **name)
{
Static int row = 1
printf ( " row= %d \n" ,row++);
return SQLITE_OK;
}
edu@edu : sqlite$make; ./example
gcc -c example.c -o example.o -Wall
gcc example.o sqlite3.o -o example -wall -lpthread -ldl
row = 1
row = 2
row =3
row = 4
row = 5
row = 6
row = 7
row = 8
row = 9
接下来,具体将值提取出来,怎样提取,拿到的有 val,直接打印:
int loadinfo (void *data,int col,char **val, char **name)
{
static int row = 1 ;int i ;
printf ( "row = %d \n" ,row++);
for (i=0 ;i<col;i++){
printf("%s=%s \n" , name [i] ,val[i]) ;
}
return SQL工TE_OK;
运行:edu@edu : sqlite$
edu@edu : sqlite$make; ./example
gcc -c example.c -o example.o -wall
gcc example.o sqlite3.o -o example -wall -lpthread -ldl
row = 1
id = 119
name = yy
addr = bj
time = (null)
date = (null)
row = 2
id = 102
name = ls
addr = tj
time = (null)
date = (null)
row = 3
id=110
以上就是通过 select 语句回调的方法来遍历返回的每一行数据。