建立資料庫過程需要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添加。

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方法: