柚子快報邀請碼778899分享:數(shù)據(jù)庫 SQLite
柚子快報邀請碼778899分享:數(shù)據(jù)庫 SQLite
1、SQLite簡介
? ? ? ? 輕量化、易用的嵌入式數(shù)據(jù)庫,用于設(shè)備端的數(shù)據(jù)管理,可以理解成單點(diǎn)的數(shù)據(jù)庫。傳統(tǒng)服務(wù)器型數(shù)據(jù)庫用于管理多端設(shè)備,更加復(fù)雜。
? ? ? ? SQLite是一個無服務(wù)器的數(shù)據(jù)庫,是自包含的。這也稱為嵌入式數(shù)據(jù)庫,這意味著數(shù)據(jù)庫引擎作為應(yīng)用程序的一部分運(yùn)行。
? ? ? ? MySQL需要運(yùn)行服務(wù)器,MySQL將需要客戶端和服務(wù)器架構(gòu)通過網(wǎng)絡(luò)進(jìn)行交互。
優(yōu)點(diǎn)缺點(diǎn)SQLite
基于文件,易于設(shè)置和使用
適合基礎(chǔ)開發(fā)和測試
輕松攜帶
使用標(biāo)準(zhǔn)
SQL
語法進(jìn)行微小更改
使用方便
缺乏用戶管理和安全功能
不容易擴(kuò)展
不適合大數(shù)據(jù)庫
無法定制
MySQL
使用方便
提供了許多與數(shù)據(jù)庫相關(guān)的功能
良好的安全功能
易于擴(kuò)展,適用于大型數(shù)據(jù)庫
提供良好的速度和性能
提供良好的用戶管理和多種訪問控制
需要一些技術(shù)專業(yè)知識來設(shè)置
與傳統(tǒng)
SQL
相比,語法略有不同
? ? ? ? 基于嵌入式的數(shù)據(jù)庫主要有:SQLite,F(xiàn)irebird,Berkeley DB,eXtremeDB
? ? ? ? ????????Firebird 是關(guān)系型數(shù)據(jù)庫,功能強(qiáng)大,支持存儲過程,SQL兼容等;
????????????????SQLite?是關(guān)系型數(shù)據(jù)庫,體積小,支持ACID事務(wù);
????????????????Berkeley DB 并沒有數(shù)據(jù)庫服務(wù)器的概念,他的程序直接鏈接到應(yīng)用程序中;
????????????????eXtremeDB 是內(nèi)存數(shù)據(jù)庫,運(yùn)行效率高。
2、SQLite安裝
? ? ? ? 方式一:
sudo apt-get install sqlite
? ? ? ? 方式二:去官網(wǎng)下載(https://www.sqlite.org/download.html),然后傳到開發(fā)板上
tar xvf sqlite-autoconf-3460000.tar.gz
cd sqlite-autoconf-3460000
#在該文件夾中會有一些幫助文檔,readme.txt會教你怎么用
#./configure --help 可以查看一些參數(shù)
#指定安裝目錄
./configure PREFIX=/usr/local
#編譯,大概要花10分鐘
make
#安裝
sudo make install
#編譯完成后回到home目錄下,輸入sqlite3會出現(xiàn)以下界面
splite3
#退出
.quit
?3、SQLite的命令用法
????????創(chuàng)建一個數(shù)據(jù)庫
//方式一, 使用.open方式創(chuàng)建 test 數(shù)據(jù)庫
sqlite3 //進(jìn)入數(shù)據(jù)庫
.open test.db
.quit //退出
//方式二
sqlite3 test.db //在命令運(yùn)行當(dāng)前窗口創(chuàng)建數(shù)據(jù)庫test.db
//在數(shù)據(jù)庫命令下
.databases //列出當(dāng)前打開的數(shù)據(jù)庫
.quit //退出
? ? ? ? 創(chuàng)建一張表格
//在SQLite中int型要用Integer表示
create table stu2(id Integer, name char, score Integer);
? ? ? ? 插入一條記錄
insert into stu values(18130106,'huang',99);
insert into stu2 values(18130101,"gang",100); //''和""都行
insert into stu(name,score) values("huanggang",98); //插入部分字段內(nèi)容
? ? ? ? 查看數(shù)據(jù)庫的記錄
select * from stu; //查詢所有字段的結(jié)果
select name,score from stu; //查詢數(shù)據(jù)庫中部分字段的內(nèi)容
? ? ? ? 刪除一條記錄
delete from stu where id = 18130101;
? ? ? ? 更改一條記錄
update stu set name = 'huangg' where id = 18130106;
????????刪除一張表
drop table stu;
? ? ? ? 增加一列
alter table stu add column sex char;
4、SQLite的編程操作
4.1?打開/創(chuàng)建數(shù)據(jù)庫的C接口
????????相關(guān)API
sqlite3_open(const char *filename, sqlite3 **ppDb)
//該例程打開一個指向 SQLite 數(shù)據(jù)庫文件的連接,返回一個用于其他 SQLite 程序的數(shù)據(jù)庫連接對象。
sqlite3_close(sqlite3*)
//該例程關(guān)閉之前調(diào)用 sqlite3_open() 打開的數(shù)據(jù)庫連接。所有與連接相關(guān)的語句都應(yīng)在連接關(guān)閉之前完成。
//如果還有查詢沒有完成,sqlite3_close() 將返回 SQLITE_BUSY 禁止關(guān)閉的錯誤消息。
const char *sqlite3_errmsg(sqlite3*);
sqlite3_errcode() //通常用來獲取最近調(diào)用的API接口返回的錯誤代碼.
#include
#include
int main(int argc, char* argv[])
{
sqlite3 *db;
int ret;
if(argc < 2){
printf("Usage: %s xxx.db\n", argv[0]);
return -1;
}
//sqlite3_open 打開一個數(shù)據(jù)庫,如果沒有則會創(chuàng)建一個
if((ret == sqlite3_open(argv[1], &db)) == SQLITE_OK){
printf("open %s success\n", argv[1]);
}else{
//sqlite3_errmsg 查詢錯誤信息
printf("error: %s\n", sqlite3_errmsg(db));
return -1;
}
//sqlite3_close 關(guān)閉之前調(diào)用 sqlite3_open() 打開的數(shù)據(jù)庫連接。所有與連接相關(guān)的語句都應(yīng)在連接關(guān)閉之前完成。
//如果還有查詢沒有完成,sqlite3_close() 將返回 SQLITE_BUSY 禁止關(guān)閉的錯誤消息。
sqlite3_close(db);
printf("done\n");
return 0;
}
4.2?創(chuàng)建表的C接口
????????相關(guān)API
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
//該例程提供了一個執(zhí)行 SQL 命令的快捷方式,SQL 命令由 sql 參數(shù)提供,可以由多個 SQL 命令組成。
//在這里,第一個參數(shù) sqlite3 是打開的數(shù)據(jù)庫對象,sqlite_callback 是一個回調(diào),data 作為其第一個參數(shù),errmsg 將被返回用來獲取程序生成的任何錯誤。
//sqlite3_exec() 程序解析并執(zhí)行由 sql 參數(shù)所給的每個命令,直到字符串結(jié)束或者遇到錯誤為止。
int callback(void *arg, int column_size, char *column_value[], char *column_name[])
//參數(shù)分析:void *arg:是sqlite3_exec函數(shù)的第四個參數(shù)
//column_size:數(shù)據(jù)庫的字段數(shù) column_value[]:列的值 column_name:字段名字
#include
#include
//void *arg sqlite3_exec函數(shù)的第四個參數(shù)
//int column_size 數(shù)據(jù)庫的字段數(shù)
//char *column_value[] 列的值
//char *column_name[] 字段名字
int callback(void *arg, int column_size, char *column_value[], char *column_name[])
{
int i;
printf("arg = %s\n", (char *)arg);
for(i=0; i printf("%s = %s\n", column_name[i], column_value[i]); } printf("===================\n"); //必須使用return 0 這樣數(shù)據(jù)庫有多少條數(shù)據(jù)就會回調(diào)幾次,不然只會回調(diào)1次 return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *errorMsg = NULL; int ret; if(argc < 2){ printf("Usage: %s xxx.db\n", argv[0]); return -1; } //sqlite3_open 打開一個數(shù)據(jù)庫,如果沒有則會創(chuàng)建一個 if((ret == sqlite3_open(argv[1], &db)) == SQLITE_OK){ printf("open %s success\n", argv[1]); }else{ //sqlite3_errmsg 查詢錯誤信息 printf("error: %s\n", sqlite3_errmsg(db)); return -1; } sqlite3_exec(db, "select * from stu;", callback, "context of sql", &errorMsg);//errorMsg may sigment error! //sqlite3_close 關(guān)閉之前調(diào)用 sqlite3_open() 打開的數(shù)據(jù)庫連接。所有與連接相關(guān)的語句都應(yīng)在連接關(guān)閉之前完成。 //如果還有查詢沒有完成,sqlite3_close() 將返回 SQLITE_BUSY 禁止關(guān)閉的錯誤消息。 sqlite3_close(db); printf("done\n"); return 0; } 4.3?插入數(shù)據(jù)的C接口 #include #include //void *arg sqlite3_exec函數(shù)的第四個參數(shù) //int column_size 數(shù)據(jù)庫的字段數(shù) //char *column_value[] 列的值 //char *column_name[] 字段名字 int callback(void *arg, int column_size, char *column_value[], char *column_name[]) { int i; printf("arg = %s\n", (char *)arg); for(i=0; i printf("%s = %s\n", column_name[i], column_value[i]); } printf("===================\n"); //必須使用return 0 這樣數(shù)據(jù)庫有多少條數(shù)據(jù)就會回調(diào)幾次,不然只會回調(diào)1次 return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *errorMsg = NULL; int ret; if(argc < 2){ printf("Usage: %s xxx.db\n", argv[0]); return -1; } //sqlite3_open 打開一個數(shù)據(jù)庫,如果沒有則會創(chuàng)建一個 if((ret == sqlite3_open(argv[1], &db)) == SQLITE_OK){ printf("open %s success\n", argv[1]); }else{ //sqlite3_errmsg 查詢錯誤信息 printf("error: %s\n", sqlite3_errmsg(db)); return -1; } ret = sqlite3_exec(db, "create table Class01(id Integer, name char, score Integer);", \ callback, "context of sql", &errorMsg); if(ret != SQLITE_OK){ printf("create tables error: %s\n", errorMsg); } //yy 在當(dāng)前行復(fù)制 p 在光標(biāo)位置粘貼 sqlite3_exec(db, "insert into Class01 values(122, 'huang', 99);", \ callback, "context of sql", &errorMsg);//errorMsg may sigment error! //sqlite3_close 關(guān)閉之前調(diào)用 sqlite3_open() 打開的數(shù)據(jù)庫連接。所有與連接相關(guān)的語句都應(yīng)在連接關(guān)閉之前完成。 //如果還有查詢沒有完成,sqlite3_close() 將返回 SQLITE_BUSY 禁止關(guān)閉的錯誤消息。 sqlite3_close(db); printf("done\n"); return 0; } 柚子快報邀請碼778899分享:數(shù)據(jù)庫 SQLite 相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。