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 语句回调的方法来遍历返回的每一行数据。

相关文章
|
2月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
134 6
|
2月前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
75 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
1月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
338 2
|
2月前
|
应用服务中间件 PHP Apache
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
|
2月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
179 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
3月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
197 5
|
3天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
48 15
|
4天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
8天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
16天前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据