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

相关文章
|
11天前
|
SQL 存储 Ubuntu
在ubuntu中将dict.txt导入到数据库sqlite3
这样,你就成功将 `dict.txt` 中的数据导入到名为 `mydatabase.db` 的SQLite3数据库中的 `words` 表格中了。请根据实际情况调整表格结构和数据导入命令。
17 0
|
11天前
|
安全 数据管理 数据库
数据管理DMS操作报错合集之阿里云DMS控制台上展示出了已经删除的数据库信息,如何解决
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
|
21天前
|
SQL 数据库 数据库管理
Python数据库操作(SQLAlchemy、SQLite等)面试题集
【4月更文挑战第15天】本文介绍了Python数据库操作的面试重点,涵盖SQLAlchemy ORM和SQLite。内容包括:1) 使用SQLAlchemy定义SQLite表的Python类及执行CRUD操作,强调ORM使用和会话管理;2) 查询优化与性能,涉及JOIN、分组、聚合查询,并提醒注意懒加载和索引创建;3) 异常处理和事务管理,展示如何捕获异常并进行事务控制。通过理解这些知识点并避免常见错误,可在面试中表现出色。
22 0
|
26天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
1月前
|
存储 关系型数据库 MySQL
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
|
1月前
|
关系型数据库 MySQL 数据库连接
Python+SQLite数据库实现服务端高并发写入
Python中使用SQLite内存模式实现高并发写入:创建内存数据库连接,建立表格,通过多线程并发写入数据。虽然能避免数据竞争,但由于SQLite内存模式采用锁机制,可能在高并发时引发性能瓶颈。若需更高性能,可选择MySQL或PostgreSQL。
35 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
10 0
|
4月前
|
存储 数据库连接 数据库
Android数据存储:解释SQLite数据库在Android中的使用。
Android数据存储:解释SQLite数据库在Android中的使用。
43 0
|
9月前
|
API 数据库 Android开发
Android 中SQLite数据库的使用详解
Android 中SQLite数据库的使用详解
64 0
|
9月前
|
数据库 Android开发 数据库管理
Android使用Room操作SQLite数据库让其变得无比高效和简洁(进一步完善用RecyclerView显示数据库中的数据)
Android使用Room操作SQLite数据库让其变得无比高效和简洁(进一步完善用RecyclerView显示数据库中的数据)
53 0