sqlite3的基本操作
生活随笔
收集整理的這篇文章主要介紹了
sqlite3的基本操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自:http://blog.chinaunix.net/uid-26833883-id-3239313.html
一、數據庫基本概念
A.數據(Data)
能夠輸入計算機并能被計算機程序識別和處理的信息集合。
B.數據庫(Database)
數據庫是在數據庫管理系統管理和控制之下,存放在存儲介質上的數據集合。
注意:數據庫管理系統(DataBase Mangement System) --DBMMS
C.數據庫管理系統(DBMS)
DBMS是數據庫系統中對數據進行統一管理和控制的軟件系統
(1)數據庫定義功能 ?(Data Definition)
(2)數據庫操縱功能 ?(Data Manpulation)
(3)數據庫運行控制功能 ?(Data Control)
(4)數據通信功能(Data ?Communication)
即 為應用程序提供的訪問接口
(5)支持存取海量數據(Mass Data)
二、文件管理和數據庫管理
A.文件管理階段
優點 : (i)數據可長期保存 (ii)能存儲大量數據
缺點: (i)數據冗余度(redundancy)、數據一致性(consistency)、完整性(integrity)難以維持 (ii)數據與程序缺乏高度獨立性
B.數據庫系統階段
(i)數據組織結構化 (ii)數據冗余度比較小,易擴充 (iii)具有較高的數據與程序之間的獨立性 (iv)統一的數據控制
三、常用的數據庫介紹
A.大型數據庫
Oracle公司是最早開發關系數據庫的廠商之一,其產品支持最廣泛的操作系統平臺。目前Oracle關系數據庫產品的市場占有率名列前茅。
IBM的DB2是第一個具備網上功能的多媒體關系數據庫管理系統,支持包括Linux在內的一系列平臺。
B.中型數據庫
SQLServer是微軟開發的數據庫產品,主要支持windows平臺。
C.小型數據庫
mysql是一個小型關系型數據管理系統,開發者為瑞典mysql AB公司,2005年被sun公司收購。開放 源碼。
D.基于嵌入式Linux的數據庫
<1>.基于嵌入式linux的數據庫主要有SQLite,Firbird,Berkeley DB,extremeDB
<2>.Firebird是關系型數據庫,功能強大,支持存儲過程、SQL兼容等
<3>.SQLite關系型數據庫,體積小,支持 ACID(原子性、一致性、獨立性及持久性 Atomicity、Consistency、Isolation、Durability)事物。
<4>.Berkeley DB中并米有數據庫服務器的概念,它的程序庫直接連接到應用程序中
<5>.extremeDB是內存數據庫,運行效率高 ??
四、sqlite的介紹
A.sqlite的源代碼是C,其源代碼完全開放。sqlite第一個Alpha版本誕生于2000年5月。他是一個輕量級的嵌入式數據庫。
B.sqlite有一下特性
<1>零配置,無需安裝和配置 <2>儲存在單一磁盤文件中的一個完整的數據庫 <3>數據庫文件可以在不同字節順序的機器間自由共享 <4>支持數據庫大小之2TB <5>足夠小,全部源代碼大致3萬行C代碼,250KB <6>比目前流行的大多數數據庫對數據的操作要快
C.sqlite數據庫工作原理
sqlite數據庫采用模塊化設計,由8個獨立的模塊構成,這些獨立模塊又構成了三個主要的子系統,模塊將復雜的查詢過程分解為細小的工作進行處理。?
sqlite主要由7個構件子系統(也就是模塊)組成,這些模塊被分割為兩個部分: 前端解析系統和后端引擎。
前端:
前端預處理應用程序傳遞過來的SQL語句和SQLite命令。對獲取的編碼分析,優化,并轉換 為后端能夠執行的SQLite內部字節編碼。前端可分為三個模塊:
<1>標示分析(Tokenizer)
將輸入的SQL語句分成標識符;
<2>語法分析(Parser)
解析器分析通過標識器產生的標識分析語句的結構,并且得到一顆語法樹。解析器同時也包含了重構語法樹的優化器,因此能夠找到一顆產生一個高效的字節編碼程序的語法樹。
<3>代碼生成器(Code Generator)
代碼生成器遍歷語法樹,并且生成一個等價的字節編碼程序
前端實現了sqlite3_prepare API函數
后端:
后端是用來解釋字節編碼程序的引擎。該引擎做的才是真正的數據庫處理工作。后端部分由四個模塊組成:
<1>虛擬機(VM) ? ??
VM模塊是一個內部字節編碼語言的解釋器。它通過執行字節編碼語句來實現SQL語句的工作。它是數據庫中數據的最終的操作者。它把數據庫看成表和索引的集合,而表和索引則是一系列的元組或者記錄。
<2>B/B+樹
B/B+樹模塊把每一個元組集組織進一個一次排好序的樹狀數據結構中,表和索引被分別置于單獨的B+和B樹中。該模塊幫助VM進行搜索,插入和刪除樹中的元組。它也幫助VM創建新的樹和刪除舊的樹
<3>頁面調度程序(pager)
頁面調度程序模塊在原始文件的上層實現了一個面向頁面的數據庫文件抽象。它管理B/B+樹使用的內存內緩存(數據庫頁的),另外,他也管理文件的鎖定,并用日志來實現事物的ACID屬性。
<4>操作系統交界面(system interface)
操作系統界面模塊提供了對應于不同本地操作系統的統一交界面
后端實現了sqlite3_bind_*,sqlite3_setp,sqlite3_coloumn_*,sqlite3_reset和sqlite3_finalize API函數。
五、sqlite的一些手動操作語句和命令
A.sqlite常用命令介紹
<1>在終端下運行sqlite3 <*.db>,出現如下提示符
<*.db>是要打開的數據庫文件。若該文件不存在,則自動創建。
<2>顯示所有命令 sqlite> .help
<3>退出sqlite3 sqlite>.quit
<4>顯示當前打開的數據庫文件 sqlite>.database
<5>顯示數據庫中所有表名 sqlite>.tables
<6>查看表的結構 sqlite>.schema ?<table_name>
注意:這些命令都是以 " . ?"開頭的。
操作案例:(我這個數據庫文件中已經創建好了表,后面將介紹如何創建和操作表)
B.sqlite常用語句?
注意:每條語句都必須以";"結尾。
<1>創建新表 sqlite>create ?table ?<table_name> ?(f1 ?type1, f2 ?type2,…); 例如: create table ?people(id,name,age);
<2>刪除表 sqlite>drop ?table ?<table_name> 例如: ?drop table people;
<3>向表中添加新記錄 ??sqlite>insert ?into ?<table_name> ?values (value1, value2,…); 例如: ?? insert into people ?values(1,'A',10); ? ? ? ? insert into people ?values(2,'B',13); ? ? ? ? insert into people ?values(3,'C',9); ? ? ? ? insert into people ?values(4,'C',15); ? ? ? ? insert into people ?values(5,NULL,NULL); ?注意: 字符串要用單引號括起來。
<4>查詢表中所有記錄 sqlite>select ?* ?from ?<table_name>; 例如 : select ? * ? from ?people;
<4>按指定條件查詢表中記錄 sqlite>select ?* ?from ?<table_name> ?where ?<expression>; 例如: 在表中搜索名字是A的項所有信息 ??select ?* ?from ?people ?where ?name='A'; 在表中搜索年齡>=10并且<=15的項的所有信息 ?select ?* ?from ? people ?where age>=10 ?and ?age<=15; 在表中搜索名字是C的項,顯示其name和age ?select name,age from people where name='C';
顯示表中的前2項所有信息 ?select ?* ?from ?people ?limit ?2; 顯示以年齡排序表中的信息 select * from people ?order by age; <6>按指定條件刪除表中記錄 sqlite>delete ?from ?<table_name> ?where ?<expression> 例如: 刪除表中名字是'C'的項 ?delete from pople ?where name='C';
<7>更新表中記錄
?sqlite>update ?<table_name> ?set ?<f1=value1>, <f2=value2>… ? where ?<expression>;?? 例如: 將表中年齡是15并且ID是4項,名字改為CYG update ?people set ?name='cyg' ?where ?id=4 and ?age=15;
<8>在表中添加字段 sqlite>alter table <table> add column <field> ; 例如: 在people表中添加一個addr字段 alter table ?people add column addr; ?注意:(來自網絡) 今天在做數據庫升級時,碰到要對原來數據庫中一張表的一個字段名進行修改,但是用: alter table tablename rename column oldColumnName to newColumnName;
始終不成功,后面查閱相關信息: SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.
sqlite支持一個更改表內容的有限子集,就是說在sqlite更改表的命令中,只允許用戶重命名表名或者增加多一個列到一個的表中。而重命名一個字段名和刪除一個字段、或者增加和刪除系統規定的參數這些操作是不可能的。
解決辦法:
例如:在上面的操作過程中,我們在people表中新添加了一個字段addr,要刪除這個字段,直接用sqlite的語句時無法完成的。 我們可以這樣干: A.將people表重命名為temp; B.重新創建people表; C.將temp表中的相應字段內容復制到people表中。 D.刪除temp表
操作如下: A.alter table people rename to temp; B.create table people(id,name,age); C.insert ?into ?people ?select ?id,name,age ?from temp; ?
六、sqlite的一些常用API
<1>sqlite里最常用到的是sqlite3 *類型。從數據庫打開開始,sqlite就要為這個類型準備好內存,直到數據庫關閉,整個過程都需要用到這個類型。當數據庫打開時開始,這個類型的變量就代表了你要操作的數據庫,即句柄。
<2>int ? sqlite3_open(char *path,sqlite3 ? **db);
功能:打開sqlite數據庫
path:數據庫文件路徑(如果不存在,則創建)
db:指向sqlite句柄的指針
返回值:如果是SQLITE_OK則表示操作正常。相關的返回值sqlite定義了一些宏。具體這些宏的含義可以參考sqlite3.h文件。
<3>int ? sqlite3_close(sqlite3 ?*db);
功能:關閉sqlite數據庫
放回值:成功返回0,失敗返回錯誤碼
<4>const char *sqlite3_errmsg(sqlite3 ? *db); 返回值:返回錯誤信息
案例:
#include?<sqlite3.h>
#include?<errno.h>
#include?<stdlib.h>
#include?<stdio.h>
int?main(int?argc,char?*argv[])
{
????sqlite3?**db;
????int?result;
????if(argc?<?2)
????{
????????fprintf(stderr,"usage : %s argv[1].\n",argv[0]);
????????exit(EXIT_FAILURE);
????}
????result?=?sqlite3_open(argv[1],&db);
????if(result?!=?SQLITE_OK)
????{
????????printf("Fail to sqlite3 open %s : %s.\n",argv[1],sqlite3_errmsg(db));
????????exit(EXIT_FAILURE);
????}
????result?=?sqlite3_close(db);
????if(result?!=?0)
????{
????????printf("Fail to sqlite3 close %s : %s.\n",argv[1],sqlite3_errmsg(db));
????????exit(EXIT_FAILURE);
????}
????
????exit(EXIT_SUCCESS);
}
<5>執行一條sql語句 typedef ?int (*sqlite3_callback)(void *,int ,char **,char **); int ?sqlite3_exec ( sqlite3 ? *db , ? const ?char *sql ,? sqlite3_callback ?callback ? , void ?*arg,char ?**errmsg? );
a.第一個參數是前面sqlite3_open函數得到的指針。
b.第二個參數const ?char ? *sql是一條sql語句,以\0結尾。
c.第三個參數callbak是回調,當這條語句執行之后,sqlite3會去調用你提供的這個函數。
d.第四個參數void *是你提供的指針,你可以傳遞任何一個指針參數到這里,這個參數最終會傳到回調函數里面,如果不需要傳遞指針給回調函數,可以填NULL。
e.第5個參數char ?**errmsg是錯誤信息。注意是指針的指針。sqlite3里面有很多固定的錯誤信息。執行sqlite3_exec之后,執行失敗是可以查閱這個指針; 例如: char *errmsg; 調用sqlite3_exec,失敗后printf("%s\n",errmsg)得到一串字符串信息,這串信息高訴你錯在什么地方。sqlite3_exec函數通過修改你傳入的指針的指針,把你提供的指針指向錯誤提示信息,這樣sqlite3_exec函數外面就可以通過這個char *errmsg得到具體錯誤提示
說明:通常,sqlite3_callback和它后面的void *這兩個位置都可以填NULL。填NULL表示你不需要回調。比如你做insert操作,做delete操作,就沒有必要使用回調。而當你做select時,就要使用回調,因為sqlite3把數據查出來,得通過回調告訴你查出了什么數據。
返回值:成功返回0,失敗返回錯誤碼
exec的回調
typedef ?int (*sqlite3_callback)(void ?*para,int ? n_column,char **column_value,char ?**column_name);
a.通過para參數,你可以傳入一些特殊的指針(比如類指針、結構指針),然后在這里面強制轉換成對應的類型(這里面是void ?*類型,必須強制轉換成你的類型才可用)。然后操作這些數據。
b.n_column是這一條記錄有多少個字段(即這條記錄有多少列)。
c.char ?**column_value是個關鍵值,查出來的數據都保存在這里,它實際上可以看做是一個一維的指針數組,每個元素都是一個char *值,是一個字段的內容(用字符串來表示,以\0結尾)。
d.char ?**column_nam 跟column_value是對應的,表示這個字段的字段名稱 。
//sqlite3的回調函數,sqlite每查到一條記錄,就調用一次這個回調
int LoadMyInfo(void ?*para,int ?n_column,char ?**column_value,char ?** column_name) { ? ? //para是你在sqlite3_exec里傳入的void ?* 參數 ? ? int ? ? i; ? ?? ? ? printf("記錄包含%d個字段\n",n_column); ? ? for(i = 0;i < n_column;i ++) ????{ ? ? ? ? printf("字段名 : %s ?<-> ?字段值 : %s.\n",column_name[i],column_value[i]); ????}
? ? printf("--------------------------\n"); ? ?? ? ? return 0; }
案例分析:
#include?<sqlite3.h>
#include?<stdio.h>
#include?<stdlib.h>
#include?<string.h>
#define MAX 100
typedef?int?(*sqlite3_callbak)(void?*,int?,char?**,char?**);
int?ShowMyInfo(void?*arg,int?n_column,char?**column_value,char?**column_name)
{
????int?i?=?0;
????for(i?=?0;i?<?n_column;i?++)
????{
????????printf("%s\t",column_name[i]);
????}
????printf("\n*************************************\n");
????for(i?=?0;i?<?n_column;i?++)
????{
????????printf("%s\t",column_value[i]);
????}
????printf("\n\n");
????return 0;
}
int?exec_sql_string(char?*sql_string,sqlite3?*db)
{
????char?*errmsg;
????if(sqlite3_exec(db,sql_string,ShowMyInfo,NULL,&errmsg)?!=?0)
????{
????????fprintf(stderr,"Fail to exec sql(%s) : %s.\n",sql_string,errmsg);
????????return?-1;
????}
????return 0;
}
int?main(int?argc,char?*argv[])
{
????sqlite3?*db;
????int?result;
????char sql_buf[MAX];
????if(argc?<?2)
????{
????????fprintf(stderr,"usage : %s argv[1].\n",argv[0]);
????????exit(EXIT_FAILURE);
????}
????result?=?sqlite3_open(argv[1],&db);
????if(result?!=?SQLITE_OK)
????{
????????fprintf(stderr,"Fail to sqlite3_open %s : %s.\n",argv[1],sqlite3_errmsg(db));
????????exit(EXIT_FAILURE);
????}
????while(1)
????{
????????printf("sqlite >");
????????fgets(sql_buf,sizeof(sql_buf),stdin);
????????sql_buf[strlen(sql_buf)?-?1]?=?'\0';
????????????????
????????????????if(strncmp(sql_buf,"quit",4)?==?0)
????????????????????????break;
????????exec_sql_string(sql_buf,db);
????}
????result?=?sqlite3_close(db);
????if(result?!=?0)
????{
????????fprintf(stderr,"Fail to sqlite3_open %s : %s.\n",argv[1],sqlite3_errmsg(db));
????????exit(EXIT_FAILURE);
????}
????exit(EXIT_SUCCESS);
} 運行結果:
<6>不使用回調函數執行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 ?: ?每條記錄包含的字段數目 注意: 從第0索引到第ncolumn-1索引都是字段的名稱 從第ncolumn索引開始,后面都是字段的值
errmsg ?: ?錯誤信息指針的地址 返回值:成功返回0,失敗返回錯誤碼
實例:
#include?<sqlite3.h>
#include?<stdio.h>
#include?<stdlib.h>
#include?<string.h>
#define MAX 100
int?exec_sql_string(char?*sql_string,sqlite3?*db)
{
????char?*errmsg,**dbResult;
????int?nRow,nColumn;
????int?result,i,j,index;
????result?=?sqlite3_get_table(db,sql_string,&dbResult,&nRow,&nColumn,&errmsg);
????if(0?!=?result){
????????fprintf(stderr,"Fail to exec sql(%s) : %s.\n",sql_string,errmsg);
????????return?-1;
????}
????
????//字段名字
????for(j?=?0;j?<?nColumn;j?++)
????{
????????printf("%s\t",dbResult[j]);
????}
????printf("\n");
????index?=?nColumn;//從它開始是字段對應的值
????for(i?=?0;i?<?nRow;i?++)//查詢到總共記錄個數
????{
????????for(j?=?0;j?<?nColumn;j?++)
????????{
????????????printf("%s\t",dbResult[index]);
????????????index?++;
????????}
????????printf("\n");
????}
????
????//釋放查詢結果所分配的內存
????sqlite3_free_table(dbResult);
????return 0;
}
int?main(int?argc,char?*argv[])
{
????sqlite3?*db;
????int?result;
????char sql_buf[MAX];
????if(argc?<?2)
????{
????????fprintf(stderr,"usage : %s argv[1].\n",argv[0]);
????????exit(EXIT_FAILURE);
????}
????result?=?sqlite3_open(argv[1],&db);
????if(result?!=?SQLITE_OK)
????{
????????fprintf(stderr,"Fail to sqlite3_open %s : %s.\n",argv[1],sqlite3_errmsg(db));
????????exit(EXIT_FAILURE);
????}
????while(1)
????{
????????printf("sqlite >");
????????fgets(sql_buf,sizeof(sql_buf),stdin);
????????sql_buf[strlen(sql_buf)?-?1]?=?'\0';
????????if(strncmp(sql_buf,"quit",4)?==?0)
????????????break;
????????exec_sql_string(sql_buf,db);
????}
????result?=?sqlite3_close(db);
????if(result?!=?0)
????{
????????fprintf(stderr,"Fail to sqlite3_open %s : %s.\n",argv[1],sqlite3_errmsg(db));
????????exit(EXIT_FAILURE);
????}
????exit(EXIT_SUCCESS);
} 運行結果:
A.數據(Data)
能夠輸入計算機并能被計算機程序識別和處理的信息集合。
B.數據庫(Database)
數據庫是在數據庫管理系統管理和控制之下,存放在存儲介質上的數據集合。
注意:數據庫管理系統(DataBase Mangement System) --DBMMS
C.數據庫管理系統(DBMS)
DBMS是數據庫系統中對數據進行統一管理和控制的軟件系統
(1)數據庫定義功能 ?(Data Definition)
(2)數據庫操縱功能 ?(Data Manpulation)
(3)數據庫運行控制功能 ?(Data Control)
(4)數據通信功能(Data ?Communication)
即 為應用程序提供的訪問接口
(5)支持存取海量數據(Mass Data)
二、文件管理和數據庫管理
A.文件管理階段
優點 : (i)數據可長期保存 (ii)能存儲大量數據
缺點: (i)數據冗余度(redundancy)、數據一致性(consistency)、完整性(integrity)難以維持 (ii)數據與程序缺乏高度獨立性
B.數據庫系統階段
(i)數據組織結構化 (ii)數據冗余度比較小,易擴充 (iii)具有較高的數據與程序之間的獨立性 (iv)統一的數據控制
三、常用的數據庫介紹
A.大型數據庫
Oracle公司是最早開發關系數據庫的廠商之一,其產品支持最廣泛的操作系統平臺。目前Oracle關系數據庫產品的市場占有率名列前茅。
IBM的DB2是第一個具備網上功能的多媒體關系數據庫管理系統,支持包括Linux在內的一系列平臺。
B.中型數據庫
SQLServer是微軟開發的數據庫產品,主要支持windows平臺。
C.小型數據庫
mysql是一個小型關系型數據管理系統,開發者為瑞典mysql AB公司,2005年被sun公司收購。開放 源碼。
D.基于嵌入式Linux的數據庫
<1>.基于嵌入式linux的數據庫主要有SQLite,Firbird,Berkeley DB,extremeDB
<2>.Firebird是關系型數據庫,功能強大,支持存儲過程、SQL兼容等
<3>.SQLite關系型數據庫,體積小,支持 ACID(原子性、一致性、獨立性及持久性 Atomicity、Consistency、Isolation、Durability)事物。
<4>.Berkeley DB中并米有數據庫服務器的概念,它的程序庫直接連接到應用程序中
<5>.extremeDB是內存數據庫,運行效率高 ??
四、sqlite的介紹
A.sqlite的源代碼是C,其源代碼完全開放。sqlite第一個Alpha版本誕生于2000年5月。他是一個輕量級的嵌入式數據庫。
B.sqlite有一下特性
<1>零配置,無需安裝和配置 <2>儲存在單一磁盤文件中的一個完整的數據庫 <3>數據庫文件可以在不同字節順序的機器間自由共享 <4>支持數據庫大小之2TB <5>足夠小,全部源代碼大致3萬行C代碼,250KB <6>比目前流行的大多數數據庫對數據的操作要快
C.sqlite數據庫工作原理
sqlite數據庫采用模塊化設計,由8個獨立的模塊構成,這些獨立模塊又構成了三個主要的子系統,模塊將復雜的查詢過程分解為細小的工作進行處理。?
sqlite主要由7個構件子系統(也就是模塊)組成,這些模塊被分割為兩個部分: 前端解析系統和后端引擎。
前端:
前端預處理應用程序傳遞過來的SQL語句和SQLite命令。對獲取的編碼分析,優化,并轉換 為后端能夠執行的SQLite內部字節編碼。前端可分為三個模塊:
<1>標示分析(Tokenizer)
將輸入的SQL語句分成標識符;
<2>語法分析(Parser)
解析器分析通過標識器產生的標識分析語句的結構,并且得到一顆語法樹。解析器同時也包含了重構語法樹的優化器,因此能夠找到一顆產生一個高效的字節編碼程序的語法樹。
<3>代碼生成器(Code Generator)
代碼生成器遍歷語法樹,并且生成一個等價的字節編碼程序
前端實現了sqlite3_prepare API函數
后端:
后端是用來解釋字節編碼程序的引擎。該引擎做的才是真正的數據庫處理工作。后端部分由四個模塊組成:
<1>虛擬機(VM) ? ??
VM模塊是一個內部字節編碼語言的解釋器。它通過執行字節編碼語句來實現SQL語句的工作。它是數據庫中數據的最終的操作者。它把數據庫看成表和索引的集合,而表和索引則是一系列的元組或者記錄。
<2>B/B+樹
B/B+樹模塊把每一個元組集組織進一個一次排好序的樹狀數據結構中,表和索引被分別置于單獨的B+和B樹中。該模塊幫助VM進行搜索,插入和刪除樹中的元組。它也幫助VM創建新的樹和刪除舊的樹
<3>頁面調度程序(pager)
頁面調度程序模塊在原始文件的上層實現了一個面向頁面的數據庫文件抽象。它管理B/B+樹使用的內存內緩存(數據庫頁的),另外,他也管理文件的鎖定,并用日志來實現事物的ACID屬性。
<4>操作系統交界面(system interface)
操作系統界面模塊提供了對應于不同本地操作系統的統一交界面
后端實現了sqlite3_bind_*,sqlite3_setp,sqlite3_coloumn_*,sqlite3_reset和sqlite3_finalize API函數。
五、sqlite的一些手動操作語句和命令
A.sqlite常用命令介紹
<1>在終端下運行sqlite3 <*.db>,出現如下提示符
<*.db>是要打開的數據庫文件。若該文件不存在,則自動創建。
<2>顯示所有命令 sqlite> .help
<3>退出sqlite3 sqlite>.quit
<4>顯示當前打開的數據庫文件 sqlite>.database
<5>顯示數據庫中所有表名 sqlite>.tables
<6>查看表的結構 sqlite>.schema ?<table_name>
注意:這些命令都是以 " . ?"開頭的。
操作案例:(我這個數據庫文件中已經創建好了表,后面將介紹如何創建和操作表)
B.sqlite常用語句?
注意:每條語句都必須以";"結尾。
<1>創建新表 sqlite>create ?table ?<table_name> ?(f1 ?type1, f2 ?type2,…); 例如: create table ?people(id,name,age);
<2>刪除表 sqlite>drop ?table ?<table_name> 例如: ?drop table people;
<3>向表中添加新記錄 ??sqlite>insert ?into ?<table_name> ?values (value1, value2,…); 例如: ?? insert into people ?values(1,'A',10); ? ? ? ? insert into people ?values(2,'B',13); ? ? ? ? insert into people ?values(3,'C',9); ? ? ? ? insert into people ?values(4,'C',15); ? ? ? ? insert into people ?values(5,NULL,NULL); ?注意: 字符串要用單引號括起來。
<4>查詢表中所有記錄 sqlite>select ?* ?from ?<table_name>; 例如 : select ? * ? from ?people;
<4>按指定條件查詢表中記錄 sqlite>select ?* ?from ?<table_name> ?where ?<expression>; 例如: 在表中搜索名字是A的項所有信息 ??select ?* ?from ?people ?where ?name='A'; 在表中搜索年齡>=10并且<=15的項的所有信息 ?select ?* ?from ? people ?where age>=10 ?and ?age<=15; 在表中搜索名字是C的項,顯示其name和age ?select name,age from people where name='C';
顯示表中的前2項所有信息 ?select ?* ?from ?people ?limit ?2; 顯示以年齡排序表中的信息 select * from people ?order by age; <6>按指定條件刪除表中記錄 sqlite>delete ?from ?<table_name> ?where ?<expression> 例如: 刪除表中名字是'C'的項 ?delete from pople ?where name='C';
<7>更新表中記錄
?sqlite>update ?<table_name> ?set ?<f1=value1>, <f2=value2>… ? where ?<expression>;?? 例如: 將表中年齡是15并且ID是4項,名字改為CYG update ?people set ?name='cyg' ?where ?id=4 and ?age=15;
<8>在表中添加字段 sqlite>alter table <table> add column <field> ; 例如: 在people表中添加一個addr字段 alter table ?people add column addr; ?注意:(來自網絡) 今天在做數據庫升級時,碰到要對原來數據庫中一張表的一個字段名進行修改,但是用: alter table tablename rename column oldColumnName to newColumnName;
始終不成功,后面查閱相關信息: SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.
sqlite支持一個更改表內容的有限子集,就是說在sqlite更改表的命令中,只允許用戶重命名表名或者增加多一個列到一個的表中。而重命名一個字段名和刪除一個字段、或者增加和刪除系統規定的參數這些操作是不可能的。
解決辦法:
例如:在上面的操作過程中,我們在people表中新添加了一個字段addr,要刪除這個字段,直接用sqlite的語句時無法完成的。 我們可以這樣干: A.將people表重命名為temp; B.重新創建people表; C.將temp表中的相應字段內容復制到people表中。 D.刪除temp表
操作如下: A.alter table people rename to temp; B.create table people(id,name,age); C.insert ?into ?people ?select ?id,name,age ?from temp; ?
六、sqlite的一些常用API
<1>sqlite里最常用到的是sqlite3 *類型。從數據庫打開開始,sqlite就要為這個類型準備好內存,直到數據庫關閉,整個過程都需要用到這個類型。當數據庫打開時開始,這個類型的變量就代表了你要操作的數據庫,即句柄。
<2>int ? sqlite3_open(char *path,sqlite3 ? **db);
功能:打開sqlite數據庫
path:數據庫文件路徑(如果不存在,則創建)
db:指向sqlite句柄的指針
返回值:如果是SQLITE_OK則表示操作正常。相關的返回值sqlite定義了一些宏。具體這些宏的含義可以參考sqlite3.h文件。
<3>int ? sqlite3_close(sqlite3 ?*db);
功能:關閉sqlite數據庫
放回值:成功返回0,失敗返回錯誤碼
<4>const char *sqlite3_errmsg(sqlite3 ? *db); 返回值:返回錯誤信息
案例:
<5>執行一條sql語句 typedef ?int (*sqlite3_callback)(void *,int ,char **,char **); int ?sqlite3_exec ( sqlite3 ? *db , ? const ?char *sql ,? sqlite3_callback ?callback ? , void ?*arg,char ?**errmsg? );
a.第一個參數是前面sqlite3_open函數得到的指針。
b.第二個參數const ?char ? *sql是一條sql語句,以\0結尾。
c.第三個參數callbak是回調,當這條語句執行之后,sqlite3會去調用你提供的這個函數。
d.第四個參數void *是你提供的指針,你可以傳遞任何一個指針參數到這里,這個參數最終會傳到回調函數里面,如果不需要傳遞指針給回調函數,可以填NULL。
e.第5個參數char ?**errmsg是錯誤信息。注意是指針的指針。sqlite3里面有很多固定的錯誤信息。執行sqlite3_exec之后,執行失敗是可以查閱這個指針; 例如: char *errmsg; 調用sqlite3_exec,失敗后printf("%s\n",errmsg)得到一串字符串信息,這串信息高訴你錯在什么地方。sqlite3_exec函數通過修改你傳入的指針的指針,把你提供的指針指向錯誤提示信息,這樣sqlite3_exec函數外面就可以通過這個char *errmsg得到具體錯誤提示
說明:通常,sqlite3_callback和它后面的void *這兩個位置都可以填NULL。填NULL表示你不需要回調。比如你做insert操作,做delete操作,就沒有必要使用回調。而當你做select時,就要使用回調,因為sqlite3把數據查出來,得通過回調告訴你查出了什么數據。
返回值:成功返回0,失敗返回錯誤碼
exec的回調
typedef ?int (*sqlite3_callback)(void ?*para,int ? n_column,char **column_value,char ?**column_name);
a.通過para參數,你可以傳入一些特殊的指針(比如類指針、結構指針),然后在這里面強制轉換成對應的類型(這里面是void ?*類型,必須強制轉換成你的類型才可用)。然后操作這些數據。
b.n_column是這一條記錄有多少個字段(即這條記錄有多少列)。
c.char ?**column_value是個關鍵值,查出來的數據都保存在這里,它實際上可以看做是一個一維的指針數組,每個元素都是一個char *值,是一個字段的內容(用字符串來表示,以\0結尾)。
d.char ?**column_nam 跟column_value是對應的,表示這個字段的字段名稱 。
//sqlite3的回調函數,sqlite每查到一條記錄,就調用一次這個回調
int LoadMyInfo(void ?*para,int ?n_column,char ?**column_value,char ?** column_name) { ? ? //para是你在sqlite3_exec里傳入的void ?* 參數 ? ? int ? ? i; ? ?? ? ? printf("記錄包含%d個字段\n",n_column); ? ? for(i = 0;i < n_column;i ++) ????{ ? ? ? ? printf("字段名 : %s ?<-> ?字段值 : %s.\n",column_name[i],column_value[i]); ????}
? ? printf("--------------------------\n"); ? ?? ? ? return 0; }
案例分析:
<6>不使用回調函數執行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 ?: ?每條記錄包含的字段數目 注意: 從第0索引到第ncolumn-1索引都是字段的名稱 從第ncolumn索引開始,后面都是字段的值
errmsg ?: ?錯誤信息指針的地址 返回值:成功返回0,失敗返回錯誤碼
實例:
總結
以上是生活随笔為你收集整理的sqlite3的基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件开发过程模型(瀑布模型,快速原型模型
- 下一篇: GooFlow .net 工作流程图