SQLite 数据库编程回调方式获取数据表信息 | 学习笔记

简介: 快速学习 SQLite 数据库编程回调方式获取数据表信息

开发者学堂课程【嵌入式之 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 语句回调的方法来遍历返回的每一行数据。

相关文章
|
安全 Java 数据库
Jasypt加密数据库配置信息
本文介绍了使用 Jasypt 对配置文件中的公网数据库认证信息进行加密的方法,以提升系统安全性。主要内容包括:1. 背景介绍;2. 前期准备,如依赖导入及版本选择;3. 生成密钥并实现加解密测试;4. 在配置文件中应用加密后的密码,并通过测试接口验证解密结果。确保密码安全的同时,保障系统的正常运行。
876 3
Jasypt加密数据库配置信息
|
JSON Java 关系型数据库
Hutool创建数据源工厂动态查询不同数据库不同数据表的数据
Hutool创建数据源工厂动态查询不同数据库不同数据表的数据
395 2
|
NoSQL 关系型数据库 分布式数据库
基于PolarDB的图分析:通过DTS将其它数据库的数据表同步到PolarDB的图
本文介绍了使用DTS任务将数据从MySQL等数据源实时同步到PolarDB-PG的图数据库中的步骤.
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
5230 2
|
缓存 数据库 数据安全/隐私保护
Discuz! X 数据库字典详解:DZ各数据表作用及字段含义
我们使用DISCUZ做网站时,有时需要对数据表进行操作,在操作数据表之前,需要对数据表进行了解。下面是DISCUZ 数据库各数据表作用及字段含义详解,方便新手更好的了解DISCUZ数据库。
610 4
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
1415 5
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
1562 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
JSON NoSQL 数据库
和SQLite数据库对应的NoSQL数据库:TinyDB的详细使用(python3经典编程案例)
该文章详细介绍了TinyDB这一轻量级NoSQL数据库的使用方法,包括如何在Python3环境中安装、创建数据库、插入数据、查询、更新以及删除记录等操作,并提供了多个编程案例。
1253 0
|
存储 数据库连接 数据库
Android数据存储:解释SQLite数据库在Android中的使用。
Android数据存储:解释SQLite数据库在Android中的使用。
354 0
|
API 数据库 Android开发
Android 中SQLite数据库的使用详解
Android 中SQLite数据库的使用详解
351 0