天天看點

iOS資料持久化-SQLite資料庫使用詳解使用SQLite資料庫

建立資料庫過程需要3個步驟:

1、使用sqlite3_open函數打開資料庫;

2、使用sqlite3_exec函數執行create table語句,建立資料庫表;

3、使用sqlite3_close函數釋放資源。

這個過程中使用了3個sqlite3函數,它們都是純c語言函數,通過objective-c去調用c函數當然不是什麼問題,但是也要注意objective-c資料類型與c資料類型相容性問題。

下面我們使用sqlite技術實作備忘錄案例,與屬性清單檔案實作一樣,我們隻需要修改持久層工程(persistencelayer)中notedao類就可以了。首先我們需要添加sqlite3庫到工程環境中,有3個工程需要添加到哪個呢?應該添加到可以運作的工程即表示層工程presentationlayer。選擇工程presentationlayer中targets→presentationlayer→link binary with libraries,點選左下角的“+”,彈出對話框選擇libsqlite3.dylib或libsqlite3.0.dylib,在彈出的對話框中點選add添加。

iOS資料持久化-SQLite資料庫使用詳解使用SQLite資料庫

notedao.h檔案的修改:

我們需要使用語句#import ”sqlite3.h”引入sqlite3頭檔案,而且需要定義sqlite3*成員變量db。notedao.m中的createeditablecopyofdatabaseifneeded方法:

createeditablecopyofdatabaseifneeded方法用于建立資料庫,第1步打開資料庫,代碼①行,語句是sqlite3_open([writabledbpath utf8string], &db),sqlite3_open函數的第1個參數是資料庫檔案完整的路徑,但是需要注意的是在sqlite3函數中接受的是char*的utf-8類型資料,需要将nsstring*轉換為utf-8,使用nsstring*的utf8string方法可以轉換,sqlite3_open函數第2個參數sqlite3指針變量db的位址。該函數的傳回值是int類型,在sqlite3中定義了很多常量,傳回值等于常量sqlite_ok則說明操作成功。

第2步執行建表語句,代碼第④行,語句sqlite3_exec(db,[createsql utf8string],null,null,&err)執行建表的sql。第1個參數是sqlite3指針變量db的位址,第2個參數是要執行的sql語句,第3個參數是要回調函數,第4個參數是要回調函數的參數,第5個參數是執行出錯的字元串。建表sql語句是,如果表note存在這不用建立。

create table if not exists note (cdate text primary key, content text)

第3步使用sqlite3_close函數釋放資源,代碼②、⑤、⑦行所示,在資料庫打開失敗、create table執行失敗和成功執行完成時候調用。原則上無論正常結束還是異常結束必須使用sqlite3_close函數釋放資源。

資料查詢一般會帶有查詢條件,這個使用sql語句where子句很容易實作,但是在程式中需要動态綁定參數給where子句。執行查詢資料步驟如下:

2、使用sqlite3_prepare_v2函數預處理sql語句;

3、使用sqlite3_bind_text函數綁定參數;

4、使用sqlite3_step函數執行sql語句,周遊結果集;

5、使用sqlite3_column_text等函數提取字段資料;

6、使用sqlite3_finalize和sqlite3_close函數釋放資源。

notedao.m中的按照主鍵查詢資料方法:

該方法執行了6個步驟,其中第1個步驟,代碼第①行所示,它與建立數庫的第1個步驟是一樣的,不用再介紹了。

第2個步驟,代碼第③行所示,語句sqlite3_prepare_v2(db, [qsql utf8string], -1, &statement, null)是預處理sql語句,預處理目的是将sql編譯成二進制代碼,提高sql語句執行的速度。sqlite3_prepare_v2函數的第3個參數-1代表全部sql字元串長度,第4個參數&statement是sqlite3_stmt指針的位址,它是語句對象,通過語句對象可以執行sql語句,第5個參數是sql語句沒有被執行的部分語句。

第3個步驟,代碼第⑤行所示,語句sqlite3_bind_text(statement, 1, [nsdate utf8string], -1, null)是綁定sql語句參數。在sql語句中帶有問号,這個問号就是要綁定的參數,問号是占位符。

nsstring *qsql = @”select cdate,content from note where cdate =?”;

sqlite3_bind_text函數是綁定參數,第1個參數是statement指針,第2個參數為序号(從1開始),第3個參數為字元串值,第4個參數為字元串長度,第5個參數為一個函數指針。

第4個步驟sqlite3_step(statement)執行sql語句,代碼第⑥行所示,sqlite3_step傳回int類型,等于sqlite_row說明還要其它的行沒有周遊。

第5個步驟提取字段資料,代碼第⑦行所示,使用sqlite3_column_text(statement, 0)函數可以讀取字元串類型字段,第2參數是指定select字段的索引(從0開始)。同樣char*轉換成為nsstring*類型,需要initwithutf8string:構造方法。讀取字段函數采用與字段類型有關系,sqlite3的類似的常用函數還有:

sqlite3_column_blob()

sqlite3_column_double()

sqlite3_column_int()

sqlite3_column_int64()

sqlite3_column_text()

sqlite3_column_text16()

關于其它的api可以參考http://www.sqlite.org/cintro.html。

第6個步驟是釋放資源,建立資料庫過程不同,除了使用sqlite3_close函數關閉資料庫,代碼第⑧行所示,還要使用sqlite3_finalize函數釋放語句對象statement代碼第⑨行所示。

notedao.m中的查詢所有資料方法:

查詢所有資料方法與按照主鍵查詢資料方法類似,差別在于本方法沒有查詢條件不需要綁定參數。周遊的時候使用while循環語句,不是if語句。

while (sqlite3_step(statement) == sqlite_row) {

… …

}

修改資料包括:insert、update和delete語句。這3個sql語句都可以帶有參數,關于參數的綁定與查詢where子句綁定的方式是一樣的。執行修改資料步驟如下:

4、使用sqlite3_step函數執行sql語句;

5、使用sqlite3_finalize和sqlite3_close函數釋放資源。

修改資料的步驟與查詢資料的步驟相比少了一個提取字段資料步驟。下面我們看看代碼部分。其它的步驟是一樣的。

notedao.m中的插入note方法:

第⑤行代碼sqlite3_step(statement)語句執行插入語句,常量sqlite_done執行完成。

notedao.m中的删除note方法: