當前位置:成語大全網 - 書法字典 - 如何使用SQLite,SQLite在Android上的最佳實踐

如何使用SQLite,SQLite在Android上的最佳實踐

SQLite3是SQLite的最新版本。妳可以從網站下載SQLite3的源代碼(本書使用的版本是sqlite-3.6.12.tar.gz)。

解壓後進入sqlite-3.6.12的根目錄。第壹,命令”。/configure”生成Makefile,然後運行命令“make”編譯源代碼,最後運行命令“make install”安裝SQLite3。安裝完成後,您可以運行命令sqlite3來查看SQLite3是否可以正常運行,如下所示:

【root @ localhost ~】# sqlite3

SQLite版本3.6.12

輸入“。幫助”以獲取說明

輸入以“;”結尾的SQL語句

sqlite & gt

可以看到,SQLite3將停留在提示符SQLite》處;等待用戶輸入SQL語句。

在使用SQLite3之前,您需要了解SQLite3支持的數據類型。SQLite3支持的基本數據類型主要包括以下幾類:

數字的

整數

真實的

文本

SQLite3會自動將其他數據類型轉換為上述五種基本數據類型,轉換規則如下:

char、clob、test、varchar-& gt;文本

整數-& gt;整數

實數、雙精度、浮點-& gt;真實的

blob-& gt;空

其余的數據類型被轉換為數值型

下面是壹個演示如何使用SQLite3的示例。

創建新數據庫

創建壹個新的數據庫test.db(後綴。db用於標識數據庫文件)。在test.db中創建壹個新表test_table,它有三列:姓名、性別和年齡。SQLite3的具體操作如下:

【root @ localhost home】# sqlite3 test . db

SQLite版本3.6.12

輸入“。幫助”以獲取說明

輸入以“;”結尾的SQL語句

sqlite & gt創建表test_table(姓名、性別、年齡);

如果數據庫test.db已經存在,命令“sqlite3 test.db”將在當前目錄中打開test.db。如果數據庫test.db不存在,命令“sqlite3 test.db”將在當前目錄中創建壹個新的數據庫test.db。為了提高效率,SQLite3不會立即創建test.db,但在創建第壹個表之前不會物理創建數據庫。

因為SQLite3可以根據插入數據的實際類型動態更改列的類型,所以不需要在create語句中給出列的類型。

創建索引

為了加快表的查詢速度,通常在主鍵中添加索引。下面是在name列上添加索引的過程。

sqlite & gt在test _ table(name)上創建索引test _ index

操作數據

以下是在test_table中插入、更新和刪除數據的操作:

sqlite & gt插入到test_table值中(‘小明‘,‘男‘,20);

sqlite & gt插入到test_table值中(‘小紅‘,‘女‘,18);

sqlite & gtselect * from test _ table

小明|男|20

小紅|女|18

sqlite & gtupdate test _ table set age = 19其中name =‘Xiaohong‘;

sqlite & gtselect * from test _ table

小明|男|20

小紅|女|19

sqlite & gt從test_table中刪除,其中name =‘Xiaoming‘;

sqlite & gtselect * from test _ table

小紅|女|19

批量操作數據庫

如下所示,test_table中插入了兩條連續的記錄:

sqlite & gt開始;

sqlite & gt插入到test_table值中(“肖雪”,“女性”,18);

sqlite & gt插入到test_table值中(‘小劉‘,‘男‘,20);

sqlite & gt提交;

sqlite & gtselect * from test _ table

小紅|女|19

肖雪|男|18

小劉|男|20

在命令commit運行之前,插入的數據不會寫入數據庫。

數據庫的導入和導出

以下是test.db到sql文件的導出:

【root @ localhost home】# sqlite3 test . db“。轉儲“》;test.sql

test.sql文件的內容如下:

開始交易;

創建表test_table(姓名、性別、年齡);

插入“test_table”值(‘小紅‘,‘女‘,19);

在test _ table(name)上創建索引test _ index

提交;

如下所示導入test.sql文件(導入前刪除原始test.db):

【root @ localhost home】# sqlite3 test . db & lt;test.sql

通過導入和導出test.sql文件,可以備份數據庫文件。

11.2.2 SQLite3的c接口

以上是SQLite3數據庫的命令操作方式。在實際使用中,通常是應用程序需要訪問數據庫。為此,SQLite3為各種編程語言提供了接口(本書介紹了C語言接口)。SQLite3有幾十個C接口。下面是壹些常用的C接口。

sqlite_open

功能:打開SQLite3數據庫。

原型:int sqlite3 _ open(const char * dbname,sqlite3 * * db)

參數:

數據庫名:數據庫的名稱;

數據庫句柄;

sqlite_colse

功能:關閉SQLite3數據庫。

原型:int SQLite _ close(sqlite3 * db)

例如:

測試c:

# include & ltstdio.h & gt

# include & ltsqlite3.h & gt

靜態sqlite3 * db = NULL

int main()

{

int rc

RC = sqlite3 _ open(“test . db“,& ampdb);

中頻(rc)

{

printf(“無法打開數據庫!\ n ");

}

其他

{

printf(“打開數據庫成功!\ n ");

}

sqlite3 _ close(db);

返回0;

}

運行命令“gcc -o test test.c -lsqlite3”進行編譯,運行測試的結果如下:

【root @ localhost home】#打開數據庫成功!

sqlite_exec

功能:執行SQL語句

prototype:int sqlite3 _ exec(sqlite3 * db,constchar * SQL,int(* callback)(void *,int,char * *),void *,char * * errmsg)。

參數:

Db:數據庫;

Sql:SQL語句;

回調:回滾;

Errmsg:錯誤消息

例如:

測試c:

# include & ltstdio.h & gt

# include & ltsqlite3.h & gt

靜態sqlite3 * db = NULL

static char * errmsg = NULL

int main()

{

int rc

RC = sqlite3 _ open(“test . db“,& ampdb);

RC = sqlite3 _ exec(db,“insert into test _ table values(‘包道‘,‘男‘,24)“,0,0,& amperrmsg);

中頻(rc)

{

printf(“exec失敗!\ n ");

}

其他

{

printf(“exec成功!\ n ");

}

sqlite3 _ close(db);

返回0;

}

編譯完成後,運行測試的結果如下:

【root @ localhost home】#。/測試

執行成功!

【root @ localhost home】# sqlite3 test . db

SQLite版本3.6.11

輸入“。幫助”以獲取說明

輸入以“;”結尾的SQL語句

sqlite & gtselect * from test _ table

包道|男|24歲

sqlite3_get_table

功能:執行SQL查詢

原型:int sqlite3 _ get _ table(sqlite3 * db,constchar * zsql,char * * pazresult,int * pnrow,int * pncolumn,char * * pzerrmsg)。

參數:

Db:數據庫;

ZSql:SQL語句;

PazResult:查詢結果集;

PnRow:結果集中的行數;

PnColumn:結果集中的列數;

Errmsg:錯誤消息;

sqlite3_free_table

角色:註銷結果集

原型:void sqlite3 _ free _ table(char * * result)

參數:

結果:結果集;

例如:

測試c:

# include & ltstdio.h & gt

# include & ltsqlite3.h & gt

靜態sqlite3 * db = NULL

static char * * Result = NULL

static char * errmsg = NULL

int main()

{

int rc,I,j;

int nrow

int ncolumn

RC = sqlite3 _ open(“test . db“,& ampdb);

RC = sqlite3 _ get _ table(db,“select * from test_table“,& amp結果& ampnrow & amp;n列,

& amperrmsg);

中頻(rc)

{

printf(“查詢失敗!\ n ");

}

其他

{

printf(“查詢成功!\ n ");

for(I = 1;我& lt= nrowi++)

{

for(j = 0;j & ltncolumnj++)

{

printf(“% s |“,Result【I * n column+j】);

}

printf(“\ n“);

}

}

sqlite3 _ free _ table(Result);

sqlite3 _ close(db);

返回0;

}

編譯完成後,運行測試的結果如下:

【root @ localhost home】#。/測試

查詢成功!

小紅|女| 19 |

肖雪|女| 18 |

小劉|男| 20 |

包道|男| 24 |

sqlite3_prepare

功能:將SQL語句編譯成字節碼,該字節碼將由下面的執行函數執行。

原型:intsqlite3 _ prepare(sqlite3 * db,constchar * zsql,intnbyte,sqlite3 _ stmt * * stmt,constchar * * ptail)。

參數:

Db:數據庫;

ZSql:SQL語句;

nbyte:SQL語句的最大字節數;

Stmt:語句句柄;

Ptail:指向SQL語句無用部分的指針;

sqlite3_step

功能:逐步執行SQL語句的字節碼。

原型:int sqlite3 _ step(sqlite3 _ stmt *)

例如:

測試c:

# include & ltstdio.h & gt

# include & ltsqlite3.h & gt

靜態sqlite3 * db = NULL

static sqlite3 _ stmt * stmt = NULL

int main()

{

int rc,I,j;

int ncolumn

RC = sqlite3 _ open(“test . db“,& ampdb);

RC = sqlite3 _ prepare(db,“select * from test_table“,-1;stmt,0);

中頻(rc)

{

printf(“查詢失敗!\ n ");

}

其他

{

printf(“查詢成功!\ n ");

RC = sqlite3 _ step(stmt);

n column = sqlite3 _ column _ count(stmt);

while(RC = = SQLITE _ ROW)

{

for(I = 0;我& lt2;i++)

{

printf(“% s |“,sqlite3 _ column _ text(stmt,I));

}

printf(“\ n“);

RC = sqlite3 _ step(stmt);

}

}

sqlite3 _ finalize(stmt);

sqlite3 _ close(db);

返回0;

}

編譯完成後,運行測試的結果如下:

【root @ localhost home】#。/測試

查詢成功!

小紅|女| 19 |

肖雪|女| 18 |

小劉|男| 20 |

包道|男| 24 |

在程序中訪問SQLite3數據庫時,要註意C API的接口定義和數據類型是否正確,否則會得到錯誤的訪問結果。