SQLite数据库在嵌入式linux下的简单使用(含移植、命令行方式使用、C语言方式使用)

什么是SQLite

SQLite logo

SQLite是一个c语言库,它实现了一个小型、快速、自包含、高可靠性、全功能的SQL数据库引擎,也是世界上使用最多的数据库引擎(大名鼎鼎的安卓内置的数据库就是SQLite)。
重要的是SQLite的开发人员承诺到2050年,SQLite文件格式是稳定的、跨平台的、向后兼容的,所以完全可以放心使用了。

本文概述

主要将介绍在嵌入式Linux中如何移植并使用SQLite数据库完成简单的增、删、改、查的功能(命令行和C语言)。

SQLite的移植

  1. 因为嵌入式Linux运行环境不确定,编译器不确定,所以选择下载源码安装,本文是在Ubuntu下对SQLite3进行编译、运行的(嵌入式Linux是一样的)。SQLite3下载地址
  2. 我这里下载的是:sqlite-autoconf-3470000.tar.gz
  3. 在Ubuntu中使用命令解压源码:tar -zxvf sqlite-autoconf-3470000.tar.gz
  4. 进入解压后的目录执行命令:./configure --host=xxx_compilation_toolchain --prefix=xxx_install_pathname,其中host指定你的编译器(如果要在嵌入式板子上运行,一般是交叉编译工具链),prefix指定安装目录(最好使用绝对路径)。
  5. 然后执行makemake install
  6. 将xxx_install_pathname目录中的bin中的拷贝到目标运行环境的/bin目录中,将xxx_install_pathname目录中的lib拷贝到目标目录的lib中,这样你就可以执行sqlite3进入数据库的命令行啦

SQLite使用

命令行下的使用方法

一般我们在最终的使用中很少去用命令行操作,但是我们在调试、测试等某些特定场合还是很好用的,这里以执行整个数据库完成增删改查功能来演示。
1、打开/创建数据库

.open test.db

打开数据库

2、创建表

语法:
CREATE TABLE database_name.table_name(
   column1 datatype  PRIMARY KEY(one or more columns),
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);

我这里增加两个表tab1和tab2,tab1中包括了一个int类型id表示编号,int类型的age表示年龄,char类型的name表示姓名;tab2中包括了一个int类型id表示编号,char类型的name表示姓名:

create table tab1 (id int,age int,name char);
create table tab2 (id int,name char);

创建两个表
3、往表中增加数据

语法:
插入全部数据:
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
指定表项插入:
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)] VALUES (value1, value2, value3,...valueN);

这里我往表tab1、tab2里增加了若干:

insert into tab1 values(1,23,'张三');
insert into tab1 (id,age,name)values(2,20,'李四');
insert into tab1 (id,name)values(3,'李四一');
insert into tab2 values(1,'王五');
insert into tab2 values(2,'陈六');

插入数据

还有其它插入技巧,本文不做演示,如:

从tab2中插入数据到tab1:
INSERT INTO tab1 [(column1, column2, ... columnN)] SELECT column1, column2, ...columnN FROM tab2 [WHERE condition];

4、删除表中信息

语法:
DELETE FROM table_name WHERE [condition];

可以根据成员内容删除,如:

#删除tab1的李四
delete from tab1 where id=2;
#删除tab2中的陈六
delete from tab2 where name='陈六';

在这里插入图片描述
注:如果想要删除表中所有内容,则不需要使用where子句,本文不做演示,如:

delete from tab1

5、改动表的信息

语法:
UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition];

可以根据表中信息来改动,如:

update tab1 set age=22 where id=3;
update tab2 set id=2 where name='王五';

更改数据
6、查阅表的信息

语法:
SELECT column1, column2, columnN FROM table_name;

在前面的演示中,其实已经多次用到了:

#查看tab1所有数据
select * from tab1;
#查看表tab1中的id数据
select id from tab1;

查询数据

7、关闭数据库

.exit 或.quit

在这里插入图片描述
8、其他常用命令,上面可能都已经用到了

.databases查看数据库信息
.schema查看所有表信息

其他命令

C语言下的使用方法

1、主要接口

/*
作用:打开一个新的数据库连接
参数1:需要打开的数据库;
参数2:数据库操作句柄,通过此句柄可操作数据库
返回值:SQLITE_OK打开成功,非SQLITE_OK打开失败
*/
int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

/*
作用:关闭数据库连接
参数:需要关闭的数据库操作句柄
返回值:SQLITE_OK关闭成功,非SQLITE_OK关闭失败
*/
int sqlite3_close(sqlite3 *);

/*
作用:执行sql语句
参数1:数据库操作句柄
参数2:要执行的sql语句
参数3:回调函数,执行完sql语句后会调用这个函数(为NULL不执行)
参数4:回调函数的第一个参数
参数5:错误信息
返回值:SQLITE_OK关闭成功,非SQLITE_OK关闭失败
*/
int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

/*
作用:执行sql后回调
参数1:表示sqlite3_exec时传入的第四个参数
参数2:本条记录有多少字段
参数3:该字段的值
参数4:跟参数3对应,该字段的名称
*/
int (*callback)(void*,int,char**,char**)

2、本文以一个示例来演示SQLite在C语言下的使用
目标功能:实现一个图书馆管理系统,管理员可以上架和下架书籍,可实现自动或者手动编号;阅读者可以购买书籍,购买后库存会根据购买数量减少;如果不存在数据库文件还会自动创建。
作者声明:本程序只是一个示例程序,目的是为了更方便的演示SQLite的C语言接口的使用,不可避免的会有漏洞、考虑不周、编码不规范的地方,敬请谅解。

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

/*
作用:执行sql后回调
参数1:表示sqlite3_exec时传入的第四个参数
参数2:本条记录有多少字段
参数3:该字段的值
参数4:跟参数3对应,该字段的名称
返回值:调用者使用
*/
static int callback(void *info, int argc, char **argv, char **azColName)
{
   
    for(int i=0; i<argc; i++)
    {
   
        printf("\t%s:%s\t", azColName[i], argv[i] ? argv[i] : "NULL");

        //这个需要获取count look_appoint_book用
        if((info != NULL) && (strcmp(azColName[i], "count") == 0))
        {
   
            *((int*)info) = atoi(argv[i]);
        }

        //这个需要获取id get_last_book_id用
        if((info != NULL) && (strcmp(azColName[i], "id") == 0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值