linux内核数据库sqlite3的移植和简单操作

转载自 http://www.cnblogs.com/liugf05/archive/2012/07/07/2580425.html 感谢作者分享
基于嵌入式linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDB
 
这几种数据库的特点:
 
•Firebird是关系型数据库,功能强大,支持存储过程、SQL兼容等
•SQLite关系型数据库,体积小,支持ACID事务
•Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中
•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了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 SQLite3 的 C API 来操作 SQLite3 数据库。以下是一个简单的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <sqlite3.h> int main(int argc, char **argv) { sqlite3 *db; char *err_msg = ; int rc; rc = sqlite3_open("test.db", &db); if (rc != SQLITE_OK) { fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } char *sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);" "INSERT INTO users (name, age) VALUES ('Alice', 25);" "INSERT INTO users (name, age) VALUES ('Bob', 30);" "INSERT INTO users (name, age) VALUES ('Charlie', 35);"; rc = sqlite3_exec(db, sql, , , &err_msg); if (rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", err_msg); sqlite3_free(err_msg); sqlite3_close(db); return 1; } sqlite3_stmt *stmt; rc = sqlite3_prepare_v2(db, "SELECT * FROM users;", -1, &stmt, ); if (rc != SQLITE_OK ) { fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) { int id = sqlite3_column_int(stmt, ); const unsigned char *name = sqlite3_column_text(stmt, 1); int age = sqlite3_column_int(stmt, 2); printf("id=%d, name=%s, age=%d\n", id, name, age); } if (rc != SQLITE_DONE) { fprintf(stderr, "Failed to fetch data: %s\n", sqlite3_errmsg(db)); } sqlite3_finalize(stmt); sqlite3_close(db); return ; } ``` 这个程序会创建一个名为 `test.db` 的 SQLite3 数据库,并在其中创建一个名为 `users` 的表,然后插入三条记录。最后,它会查询 `users` 表中的所有记录,并将它们打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值