<nav id="gb9pn"></nav>

  1. <form id="gb9pn"><legend id="gb9pn"></legend></form>

    <form id="gb9pn"><legend id="gb9pn"><video id="gb9pn"></video></legend></form>
  2. 当前位置: > 华清远见教育集团 > 嵌入式学习 > 讲师博文 > linux内核数据库sqlite3的移植和简单操作
    linux内核数据库sqlite3的移植和简单操作
    时间:2016-12-12作者:华清远见

    基于嵌入式linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDB

    这几种数据库的特点:

    1.Firebird是关系型数据库,功能强大,支持存储过程、SQL兼容等
            2.SQLite关系型数据库,体积小,支持ACID事务
            3.Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中
            4.eXtremeDB是内存数据库,运行效率高

    SQLite的源代码是C,其源代码完全开放,是一个轻量级的嵌入式数据库。

    SQLite有以下特性:
            零配置一无需安装和管理配置;
            储存在单一磁盘文件中的一个完整的数据库;
            数据库文件可以在不同字节顺序的机器间自由共享;
            支持数据库大小至2TB;
            足够小,全部源码大致3万行c代码,250KB;
            比目前流行的大多数数据库对数据的操作要快;
            这个数据库操作比较简单,首先要安装数据库:

    这个很简单,在http://www.sqlite.org/download.html这个sqlite主页的下载目录中找到对应的linux版本。下载完成后解压,执行里面的 configure。如图:


    执行完之后要执行 sudo make && make install

    等待一段时间就可以安装完成。

    完成以后看一下我们sqlite3的执行文件的路径在哪里如图:


    在/usr/local/bin目录里。

    为了以后的方便,可以将该目录加入到环境变量里,先打开 sudo vim /environment 将路径加入到这里,如何将sqlite3 移植到开发板上呢?

    1、去掉/root/sqlite3.3.6目录下的sqlite3的调示信息:(俗称瘦身)
    #arm-linux-strip sqlite3

    2、将sqlite3下载到开发板的/usr/bin目录:
            在PC机的目录/usr/lib 中找到libsqlite3.so.0、libsqlite3.so.0.8.6这两个库文件,去掉调示信息后把它们复制到开发板的/usr/lib目录下:
            arm-linux-strip libsqlite3.so.0 (/home/linux/sqlite/lib)
            arm-linux-strip libsqlite3.so.0.8.6 (/home/linux/sqlite/lib)
            cp –arf libsqlite3.so.0 libsqlite3.so.0.8.6 /usr/lib 加上arf的目的是将源库拷贝,千万别只拷贝个链接,那么就悲剧了。。。

    经过以上步骤,开发板上就已经有了sqlite数据库。 sqlite的一些基本操作可以在网上找一下,SQL语句都是通用的,所以比较重要的是sqlite3特供的一些操作数据库的接口:

    int sqlite3_open(char *path, sqlite3 **db);
            功能:打开sqlite数据库
            path: 数据库文件路径
            db: 指向sqlite句柄的指针
            返回值:成功返回0,失败返回错误码(非零值)

    int sqlite3_close(sqlite3 *db);
            功能:关闭sqlite数据库
            返回值:成功返回0,失败返回错误码
            const char *sqlite3_errmg(sqlite3 *db);
            返回值:返回错误信息

    gcc -o test test.c -lsqlite3
            }
    回调函数的定义:
    typedef int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);
    }
            功能:每找到一条记录自动执行一次回调函数
            para:传递给回调函数的参数
            f_num:记录中包含的字段数目
            f_value:包含每个字段值的指针数组
            f_name:包含每个字段名称的指针数组
            返回值:成功返回0,失败返回-1
    int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);
            功能:执行SQL操作
            db:数据库句柄
            sql:SQL语句
            callback:回调函数
            errmsg:错误信息指针的地址
            返回值:成功返回0,失败返回错误码

    例如:定义一个回调函数,打印记录中所有字段的名称和值
    int callback(void *para, intf_num, char **f_value, char **f_name)
    {
            int i;
            printf("*****************************\n");
            for (i=0; i< f_num; i++)
            {
            printf("%s : %s\n", f_name[i], f_value[i]);
            }
            return 0;
    }
    sqlite3 *db;
    char *errmsg;

    ……
    if (sqlite3_exec(db, "select * from table", callback, NULL, &errmsg) != SQLITE_OK)
    {
            printf("error : %s\n", errmsg);
            exit(-1);
    }
    ……

    不使用回调函数执行SQL语句
    int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int*nrow, int *ncolumn, char **errmsg);
    函数功能:执行SQL操作
    函数参数:
            db:数据库句柄
            sql:SQL语句
            resultp:用来指向sql执行结果的指针
            nrow:满足条件的记录的数目
            ncolumn:每条记录包含的字段数目
            errmsg:错误信息指针的地址
    返回值:成功返回0,失败返回错误码

    sqlite3 *db;
    char *errmsg,**resultp;
    int nrow, ncolumn, i, j, index;
    ……
    if (sqlite3_exec(db, "select * from table", &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK)
    {
            printf("error : %s\n", errmsg);
            exit(-1);
    }
    index = ncolumn; // 第一条记录的第一个字段的下标
    for (i=0; i< nrow; i++)
     {
            for (j=0; j< ncolumn; j++)
            {
            printf("%s : %s\n", resultp[j], resultp[index++]);
            }
    }
    有了这几个函数,数据库的操作就基本上OK了.

    发表评论
    评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
    welcome购彩中心