日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

嵌入式数据库sqlite在ARM上的的移植和使用

發布時間:2023/12/20 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式数据库sqlite在ARM上的的移植和使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考http://blog.csdn.net/whz_zb/article/details/7610571,如有侵權,請告知刪除。

參考:頭文件路徑問題?https://www.cnblogs.com/linuxbo/p/4301716.html

參考:進一步學習資源?http://www.cnblogs.com/likebeta/tag/SQlite/


一、源碼獲取

http://sqlite.org/download.html


二、移植步驟

(1)下載和復制數據庫sqlite-autoconf-3210000.tar.gz至目錄/tmp/mysql。

(2)解壓:tar –zxvf sqlite-autoconf-3210000.tar.gz,得到sqlite-autoconf-3210000。

(3)新建某個目錄,存放編譯后生成的文件。我這里是/tmp/build。

(4)配置:進入sqlite-autoconf-3210000中,使用命令:

  • ./configure ?--host=arm-linux(這里根據需要可以改為gcc,即省去該配置參數(刪除--host),默認使用gcc)? --prefix=/tmp/build
  • --host后面接的是編譯工具,--prefix后面接的是用來存放配置文件的位置。

(5)編譯和安裝:make之后再make install安裝。

(6)移植:編譯好后在build目錄中會生成4個文件夾“bin 、include 、lib 、share”。將bin文件夾中的文件拷貝到開發板的/bin中,并將lib中的文件拷貝到開發板的/lib中。

(7)檢驗是否移植成功:輸入sqlite3 ?test.db。如果成功會打印



三、常用命令

1、新建一個數據庫

  • sqlite3 ?xxx.db(假定這里xxx.db是zieckey.db)

2、創建表和插入值

(1)可以用CREATE TABLE語法命令。

  • CREATE TABLE語句基本上就是"CREATE TABLE"關鍵字后跟一個新的表名以及括號內的一堆定義和約束。
  • 表名可以是字符串或者標識符。以"sqlite_"開頭的表名是留給sqlite數據庫引擎使用的。
  • 每個字段的定義是字段名后跟字段的數據類型,接著是一個或多個的字段約束。字段的數據類型并不限制字段中可以存放的數據。

(2)實例

sqlite> CREATE TABLE SensorData(
? ?...> ID INTEGER PRIMARY KEY,
? ?...> SensorID INTEGER,
? ?...> SiteNum INTEGER,
? ?...> Time VARCHAR(12),
? ?...> SensorParameter REAL
? ?...> );


3、查看所創建的表

(1).schema 是用來查看數據庫中所有的表的定義內容。如果后面跟了具體的表名稱,則顯示該表的內容。

(2)實例

sqlite> .schema
CREATE TABLE SensorData(
ID INTEGER PRIMARY KEY,
SensorID INTEGER,
SiteNum INTEGER,
Time VARCHAR(12),
SensorParameter REAL
);
sqlite>?


3、向表中插入具體元素值

sqlite> INSERT INTO "SensorData" VALUES(2, 1, 0, '200605011306', 16.4);
sqlite> INSERT INTO "SensorData" VALUES(3, 1, 0, '200605011406', 15.3);
sqlite> INSERT INTO "SensorData" VALUES(4, 1, 0, '200605011506', 15.5);


4、在線幫助:.help

5、查看當前數據庫下的所有表:.table

6、退出sqlite3:.quit


四、linux下用c語言操作數據庫

1、調用 sqlite 的 API 接口函數示例

(1)移植好sqlite。

(2)先創建如下文件test.c

// name: opendbsqlite.c // This prog is used to test C/C++ API for sqlite3.It is very simple,ha!#include <stdio.h> #include "sqlite3.h"int main( int argc, char **argv ) {char *file = "database.sqlite3";sqlite3 *pDB = NULL;int rc = 0;sqlite3_initialize( );rc = sqlite3_open_v2( file, &pDB, SQLITE_OPEN_READWRITE |SQLITE_OPEN_CREATE, NULL );if ( rc != SQLITE_OK){sqlite3_close_v2( pDB );}/* perform database operations */sqlite3_close_v2( pDB );} (2)然后

root@ubuntu:/tmp# ?gcc test.c -lsqlite3 -L/tmp/build/lib/ -I/tmp/build/include/
root@ubuntu:/tmp# ls
a.out ?build ?mysql ?ssh-KQYQ2kfL2MIM ?test.c ?VMwareDnD ?vmware-root ?vmware-root-859941367 ?vmware-xjh ?wifi_test
root@ubuntu:/tmp# ./a.out
root@ubuntu:/tmp# ls
a.out ?build ?database.sqlite3 ?mysql ?ssh-KQYQ2kfL2MIM ?test.c ?VMwareDnD ?vmware-root ?vmware-root-859941367 ?vmware-xjh ?wifi_test
root@ubuntu:/tmp#?


2、向數據庫插入數據

(1)代碼

// name: insert.c // This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !#include <stdio.h> #include <stdlib.h> #include "sqlite3.h" #define _DEBUG_int main( void ) {sqlite3 *db=NULL;char *zErrMsg = 0;int rc;char *sql;rc = sqlite3_open("zieckey.db", &db); //打開指定的數據庫文件,如果不存在將創建一個同名的數據庫文件if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 0;}else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");//創建一個表,如果該表存在,則不創建,并給出提示信息,存儲在 zErrMsg 中sql = "CREATE TABLE SensorData(\ID INTEGER PRIMARY KEY, \SensorID INTEGER, \SiteNum INTEGER, \Time VARCHAR(12), \SensorParameter REAL \);";sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );//插入數據 sql = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '201205011206', 18.9 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '201205011306', 16.4 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sqlite3_close(db); //關閉數據庫return 0; }

(2)然后

root@ubuntu:/tmp# ./build/bin/sqlite3 zieckey.db?
SQLite version 3.21.0 2017-10-24 18:55:49
Enter ".help" for usage hints.
sqlite> select * from SensorData;//這里記得有分號
1|1|1|201205011206|18.9
2|1|1|201205011306|16.4
sqlite>?


3、查詢數據庫中的數據

(1)代碼

// name: query.c // This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !#include <stdio.h> #include <stdlib.h> #include "sqlite3.h" #define _DEBUG_int main( void ) {sqlite3 *db=NULL;char *zErrMsg = 0;int rc;rc = sqlite3_open("zieckey.db", &db); //打開指定的數據庫文件,如果不存在將創建一個同名的數據庫文件if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 0;}else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");//創建一個表,如果該表存在,則不創建,并給出提示信息,存儲在 zErrMsg 中char *sql = " CREATE TABLE SensorData(\ID INTEGER PRIMARY KEY,\SensorID INTEGER,\SiteNum INTEGER,\Time VARCHAR(12),\SensorParameter REAL\);" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endif//插入數據 sql = "INSERT INTO \"SensorData\" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"SensorData\" VALUES(NULL , 1 , 1 , '200605011306', 16.4 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );int nrow = 0, ncolumn = 0;char **azResult; //二維數組存放結果//查詢數據/*int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg );result中是以數組的形式存放你所查詢的數據,首先是表名,再是數據。nrow ,ncolumn分別為查詢語句返回的結果集的行數,列數,沒有查到結果時返回0*/sql = "SELECT * FROM SensorData ";sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );int i = 0 ;printf( "row:%d column=%d \n" , nrow , ncolumn );printf( "\nThe result of querying is : \n" );for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )printf( "azResult[%d] = %s\n", i , azResult[i] );//釋放掉 azResult 的內存空間sqlite3_free_table( azResult );#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endifsqlite3_close(db); //關閉數據庫 return 0;}
(2)然后
root@ubuntu:/tmp# ./a.out?
You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun ! ^-^?
zErrMsg = table SensorData already exists?
row:4 column=5?


The result of querying is :?
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 1
azResult[7] = 1
azResult[8] = 201205011206
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 1
azResult[12] = 1
azResult[13] = 201205011306
azResult[14] = 16.4
azResult[15] = 3
azResult[16] = 1
azResult[17] = 1
azResult[18] = 200605011206
azResult[19] = 18.9
azResult[20] = 4
azResult[21] = 1
azResult[22] = 1
azResult[23] = 200605011306
azResult[24] = 16.4
zErrMsg = (null)?
root@ubuntu:/tmp#?

(3)分析

azResult 的前面 5 個數據正好是我們的表 SensorData 的列屬性,之后才是我們要查詢的數據。

所以我們的程序中才有 i<( nrow + 1 ) * ncolumn 的判斷條件:

for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
? ? ?printf( "azResult[%d] = %s\n", i , azResult[i] );

輸出中有 zErrMsg = (null) 這樣的字句,這是 zErrMsg 保留的錯誤信息,zErrMsg 為空,表明在執行過程中沒有錯誤信息。


4、刪除數據庫中的特定的數據

(1)代碼

// name: delete.c // This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !#include <stdio.h> #include <stdlib.h> #include "sqlite3.h" #define _DEBUG_int main( void ) {sqlite3 *db=NULL;char *zErrMsg = 0;int rc;rc = sqlite3_open("zieckey.db", &db); //打開指定的數據庫文件,如果不存在將創建一個同名的數據庫文件if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 0;}else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");//創建一個表,如果該表存在,則不創建,并給出提示信息,存儲在 zErrMsg 中char *sql = " CREATE TABLE SensorData(\ID INTEGER PRIMARY KEY,\SensorID INTEGER,\SiteNum INTEGER,\Time VARCHAR(12),\SensorParameter REAL\);" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endif//插入數據 sql = "INSERT INTO \"SensorData\" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"SensorData\" VALUES(NULL , 23 , 45 , '200605011306', 16.4 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"SensorData\" VALUES(NULL , 34 , 45 , '200605011306', 15.4 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );int nrow = 0, ncolumn = 0;char **azResult; //二維數組存放結果//查詢數據sql = "SELECT * FROM SensorData ";sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );int i = 0 ;printf( "row:%d column=%d \n" , nrow , ncolumn );printf( "\nThe result of querying is : \n" );for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )printf( "azResult[%d] = %s\n", i , azResult[i] );//刪除數據sql = "DELETE FROM SensorData WHERE SensorID = 1 ;" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endifsql = "SELECT * FROM SensorData ";sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );printf( "\n\n\n\nrow:%d column=%d " , nrow , ncolumn );printf( "\nAfter deleting , the result of querying is : \n" );for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )printf( "azResult[%d] = %s\n", i , azResult[i] );//釋放掉 azResult 的內存空間sqlite3_free_table( azResult );#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endifsqlite3_close(db); //關閉數據庫return 0;} (2)然后

root@ubuntu:/tmp# gcc test.c -lsqlite3 -L/tmp/build/lib/ -I/tmp/build/include/
root@ubuntu:/tmp# ./a.out?
You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun ! ^-^?
zErrMsg = table SensorData already exists?
row:7 column=5?


The result of querying is :?
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 1
azResult[7] = 1
azResult[8] = 201205011206
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 1
azResult[12] = 1
azResult[13] = 201205011306
azResult[14] = 16.4
azResult[15] = 3
azResult[16] = 1
azResult[17] = 1
azResult[18] = 200605011206
azResult[19] = 18.9
azResult[20] = 4
azResult[21] = 1
azResult[22] = 1
azResult[23] = 200605011306
azResult[24] = 16.4
azResult[25] = 5
azResult[26] = 1
azResult[27] = 1
azResult[28] = 200605011206
azResult[29] = 18.9
azResult[30] = 6
azResult[31] = 23
azResult[32] = 45
azResult[33] = 200605011306
azResult[34] = 16.4
azResult[35] = 7
azResult[36] = 34
azResult[37] = 45
azResult[38] = 200605011306
azResult[39] = 15.4
zErrMsg = (null)?


row:2 column=5?
After deleting , the result of querying is :?
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 6
azResult[6] = 23
azResult[7] = 45
azResult[8] = 200605011306
azResult[9] = 16.4
azResult[10] = 7
azResult[11] = 34
azResult[12] = 45
azResult[13] = 200605011306
azResult[14] = 15.4
zErrMsg = (null)?
root@ubuntu:/tmp#?

(3)分析

從程序輸出結果就可以看出,在刪除數據前,我們有三條記錄,刪除數據后我們發現,數據庫內記錄少了,從而實現了我們的刪除數據目的。

總結

以上是生活随笔為你收集整理的嵌入式数据库sqlite在ARM上的的移植和使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。