欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【嵌入式实验】嵌入式数据库 sqlite 移植及使用

程序员文章站 2022-05-22 20:57:19
...

更多笔记内容可以查看 计算机专业基础笔记目录

一、实验目的

理解嵌入式软件移植的基本方法,掌握 sqlite 数据库软件移植的步骤,掌握 sqlite 开发的两种方式 — 命令模式和 C代码开发模式 的使用方法,并编程实现简单通讯录查询实验。

二、实验内容

实验4.1 移植嵌入式数据库 sqlite
实验4.2 简单通讯录查询实例设计和测试

三、预备知识

Linux 使用、数据库相关知识等

四、实验设备及工具(包括软件调试工具)

硬件:ARM 嵌入式开发平台、PC 机 Pentium100 以上、串口线。
软件: WinXP 或 UBUNTU 开发环境。(我用的 DeepIn)

五、实验步骤

实验一:移植嵌入式数据库 sqlite

1~5:安装 sqlite 数据库

第一步,解压缩 sqlite 源码,命令 tar xvzf sqlite-autoconf-3080900.tar.gz
【嵌入式实验】嵌入式数据库 sqlite 移植及使用
在解压后的文件夹下,可以看到源码文件有(shell.c)和(sql3.c)文件;
【嵌入式实验】嵌入式数据库 sqlite 移植及使用
生成 Makefile 的配置脚本文件 ./configure --prefix=/opt/sqlite
【嵌入式实验】嵌入式数据库 sqlite 移植及使用
并检查当前文件夹下(存在)Makefile 文件。(可以仔细看看上上张图,那时候还没有呢。)
【嵌入式实验】嵌入式数据库 sqlite 移植及使用
第二步利用 configure 脚本文件生成基于 ARM 实验台的 Makefile,具体命令为 ./configure CC=arm-linux-gcc –prefix=/opt/sqlite –host=arm-linux,并检查当前文件夹下(存在)Makefile 文件。
【嵌入式实验】嵌入式数据库 sqlite 移植及使用
第三步,编译 sqlite,命令为 make,编译过程中使用的编译器为 arm-linux-gcc
【嵌入式实验】嵌入式数据库 sqlite 移植及使用
第四步,安装 sqlit,命令为 make insatll。安装完成后到 \opt\sqlite 文件夹下去查看相关文件,可以看到该文件夹下有(bin)、(include)、(lib)和 share 文件夹,其中可执行文件 sqlite3 位于(./bin)文件夹,库位于(./lib)文件夹。
【嵌入式实验】嵌入式数据库 sqlite 移植及使用

第五步,将 sqlite3 拷贝到开发板 bin 目录下,将库下的文件拷贝到开发板的 lib 目录***意链接文件的创建】

6:数据库的使用

方式1:命令操纵数据库

在超级终端环境下创建数据库 stucomm.db,命令为 ./sqilte3 stucomm.db
(如果没有配置环境变量则要在 /opt/sqlite/bin 目录下输入命令)
【嵌入式实验】嵌入式数据库 sqlite 移植及使用
创建数据表 stutable,字段包括 id 整型,name 字符型,phoneNum 字符型,具体命令为:

create table stutable(id integer, name text, phoneNum text);

插入2条记录,记录信息如下(001,zhangsan,10086)、(002,lisi,10000),具体命令为:

insert into stutable values(1, 'zhangsan', 10086);
insert into stutable values(2, 'lisi', 10000);

查询电话号码为 10086 的相关记录信息,命令为:

select * from stutable where phoneNum = 10086;

【嵌入式实验】嵌入式数据库 sqlite 移植及使用

方式2:编程操纵数据库

使用 C编程模式 完成上述功能,代码如下:

#include<stdio.h>
#include"sqlite/sqlite3.h"

/*
(1)打开数据库:
int sqlite3_open(const char *filename, sqlite3 **ppDb);
- filename:待打开(创建)的数据库文件名
- ppDb:sqlite3数据库句柄的指针

(2)操作数据库:sqlite可以提供了接口,可以把SQL操作语句直接嵌入到sqlite函数中来执行。
int  sqlite3_exec(sqlite3* ppDb, const char *sql, 
    int(*callback)(void*, int, char**, char**), void*, char **errmsg);
- sqlite3* 是open函数得到的指针
- constchar*sql是一条sql 语句,以\0结尾
- sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用这个函数
- void*是调用者所提供的指针, 调用者可以传递任何一个指针参数到这里,
        这个参数最终会传到回调函数里面, 如果不需要传递指针给回调函数,可以填 NULL
- char** errmsg 是错误信息

(3)关闭数据库:数据库不使用后需要关闭。
int sqlite3_close(sqlite3 *ppDb); 
*/

// 回调函数
int callback(void *, int, char**, char**);
// 检查数据库操作是否正常执行
int check_opt(sqlite3 *db, int nResult, char* errmsg) {
    sqlite3_close(db); // 关闭数据库
    printf("%s", errmsg);
    sqlite3_free(errmsg);
    return 0;
}

int main() {
    sqlite3 * db;
    // 打开内存数据库
    int nResult = sqlite3_open(":memory:", &db);
    if (nResult != SQLITE_OK) {
        printf("打开数据库失败\n");
        return 0;
    } else {
        printf("打开数据库成功\n");
    }

    // 错误信息
    char* errmsg;
    nResult = sqlite3_exc(db, "create table stutable(id integer, name text, phoneNum text);",
                            NULL, NULL, &errmsg);

    check_opt(db, nResult, &errmsg); // 检查操作是否正常执行
    
    nResult = sqlite3_exc(db, "insert into stutable values(1, 'zhangsan', 10086);",
                            NULL, NULL, &errmsg);
    check_opt(db, nResult, &errmsg); // 检查操作是否正常执行

    nResult = sqlite3_exc(db, "insert into stutable values(1, 'zhangsan', 10086);",
                            NULL, NULL, &errmsg);
    check_opt(db, nResult, &errmsg); // 检查操作是否正常执行

    nResult = sqlite3_exec(db, "select * from stutable where phoneNum = 10086;",
                            callback, NULL, &errmsg);
    check_opt(db, nResult, &errmsg); // 检查操作是否正常执行

    int callback(void*, int nCount, char** pValue, cahr** pName) {
        for (int i = 0; i < nCount; i++) {
            printf("[%s] = [%s]\n", pName[i], pValue[i]);
        }
        return 0;
    }

}

假设上述代码文件名为 sqlite_exp.c 文件,编译命令为

arm-linux-gcc -o sql_exp sqlite_exp.c -l /opt/sqlite/include -L /opt/sqlite/lib

其中头文件位于 /opt/sqlite/include,库位于 /opt/sqlite/lib 下。

实验二:嵌入式Qt实验

去写个支部大会的报告,回来再做。。。