1 首先獲取iPhone上sqlite3的數(shù)據(jù)庫(kù)文件的地址
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database_name"];
2打開iPhone上的sqlite3的數(shù)據(jù)庫(kù)文件
sqlite3 *database;
sqlite3_open([path UTF8String], &database);
3 準(zhǔn)備sql文---sql語句
sqlite3_stmt *stmt;
const char *sql = "SELECT * FROM table_name WHERE pk=? and name=?";
sqlite3_prepare_v2(database,sql, -1, &stmt, NULL);
4邦定參數(shù)
// 邦定第一個(gè)int參數(shù)
sqlite3_bind_int(stmt, 1, 1);
// 邦定第二個(gè)字符串參數(shù)
sqlite3_bind_text(stmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);
5執(zhí)行sql文
sqlite3_step(stmt);
6釋放sql文資源
sqlite3_finalize(stmt);
7關(guān)閉iPhone上的sqlite3的數(shù)據(jù)庫(kù)
sqlite3_close(database);
http://hi.baidu.com/clickto/blog/item/0c6904f787c34125720eec87.html
以下演示一下使用sqlite的步驟鳄抒,先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),然后查詢其中的內(nèi)容。2個(gè)重要結(jié)構(gòu)體和5個(gè)主要函數(shù):
sqlite3? ? ? ? ? ? ? *pdb, 數(shù)據(jù)庫(kù)句柄舀凛,跟文件句柄FILE很類似
sqlite3_stmt? ? ? *stmt, 這個(gè)相當(dāng)于ODBC的Command對(duì)象匹中,用于保存編譯好的SQL語句
sqlite3_open(),? 打開數(shù)據(jù)庫(kù)
sqlite3_exec(),? 執(zhí)行非查詢的sql語句
sqlite3_prepare(), 準(zhǔn)備sql語句宏怔,執(zhí)行select語句或者要使用parameter bind時(shí)坊谁,用這個(gè)函數(shù)(封裝了sqlite3_exec).
Sqlite3_step(), 在調(diào)用sqlite3_prepare后篓吁,使用這個(gè)函數(shù)在記錄集中移動(dòng)。
Sqlite3_close(), 關(guān)閉數(shù)據(jù)庫(kù)文件
還有一系列的函數(shù)削咆,用于從記錄集字段中獲取數(shù)據(jù)牍疏,如
sqlite3_column_text(), 取text類型的數(shù)據(jù)。
sqlite3_column_blob()拨齐,取blob類型的數(shù)據(jù)
sqlite3_column_int(), 取int類型的數(shù)據(jù)
PreparedStatement方式處理SQL請(qǐng)求的過程
特點(diǎn):可以綁定參數(shù)鳞陨,生成過程。執(zhí)行的時(shí)候像是ADO一樣瞻惋,每次返回一行結(jié)果炊邦。
1. 首先建立statement對(duì)象:
int sqlite3_prepare(
sqlite3 *db,? ? ? ? ? ? /* Database handle */
const char *zSql,? ? ? /* SQL statement, UTF-8 encoded */
int nBytes,? ? ? ? ? ? /* Length of zSql in bytes. */
sqlite3_stmt **ppStmt,? /* OUT: Statement handle */
const char **pzTail? ? /* OUT: Pointer to unused portion of zSql */
);
2. 綁定過程中的參數(shù)(如果有沒有確定的參數(shù))
int sqlite3_bind_xxxx(sqlite3_stmt*, int, ...);
第二個(gè)int類型參數(shù)-表示參數(shù)的在SQL中的序號(hào)(從1開始)。
第三個(gè)參數(shù)為要綁定參數(shù)的值熟史。
對(duì)于blob和text數(shù)值的額外參數(shù):
第四參數(shù)是字符串(Unicode 8or16)的長(zhǎng)度馁害,不包括結(jié)束'\0'。
第五個(gè)參數(shù)蹂匹,類型為void(*)(void*)碘菜,表示SQLite處理結(jié)束后用于清理參數(shù)字符串的函數(shù)。
沒有進(jìn)行綁定的未知參數(shù)將被認(rèn)為是NULL限寞。
3. 執(zhí)行過程
int sqlite3_step(sqlite3_stmt*);
可能的返回值:
*SQLITE_BUSY:? 數(shù)據(jù)庫(kù)被鎖定忍啸,需要等待再次嘗試直到成功。
*SQLITE_DONE:? 成功執(zhí)行過程(需要再次執(zhí)行一遍以恢復(fù)數(shù)據(jù)庫(kù)狀態(tài))
*SQLITE_ROW:? ? 返回一行結(jié)果(使用sqlite3_column_xxx(sqlite3_stmt*,, int iCol)得到每一列的結(jié)果履植。
再次調(diào)用將返回下一行的結(jié)果计雌。
*SQLITE_ERROR:? 運(yùn)行錯(cuò)誤,過程無法再次調(diào)用(錯(cuò)誤內(nèi)容參考sqlite3_errmsg函數(shù)返回值)
*SQLITE_MISUSE: 錯(cuò)誤的使用了本函數(shù)(一般是過程沒有正確的初始化)
4. 結(jié)束的時(shí)候清理statement對(duì)象
int sqlite3_finalize(sqlite3_stmt *pStmt);
應(yīng)該在關(guān)閉數(shù)據(jù)庫(kù)之前清理過程中占用的資源玫霎。
5. 重置過程的執(zhí)行
int sqlite3_reset(sqlite3_stmt *pStmt);
過程將回到?jīng)]有執(zhí)行之前的狀態(tài)凿滤,綁定的參數(shù)不會(huì)變化。
其他工具函數(shù)
1. 得到結(jié)果總共的行數(shù)
int sqlite3_column_count(sqlite3_stmt *pStmt);
如果過程沒有返回值庶近,如update翁脆,將返回0
2. 得到當(dāng)前行中包含的數(shù)據(jù)個(gè)數(shù)
int sqlite3_data_count(sqlite3_stmt *pStmt);
如果sqlite3_step返回SQLITE_ROW,可以得到列數(shù)鼻种,否則為零反番。
3. 得到數(shù)據(jù)行中某個(gè)列的數(shù)據(jù)
sqlite3_column_xxx(sqlite3_stmt*, int iCol);
在sqlite3_step返回SQLITE_ROW后,使用它得到第iCol列的數(shù)據(jù)叉钥。
其中的xxx代表:
blob:指向保存數(shù)據(jù)內(nèi)存的指針
bytes, bytes16: 得到該blob類型數(shù)據(jù)的大小罢缸,或者text轉(zhuǎn)換為UTF8/UTF16的字符串長(zhǎng)度。
double, int, int64: 數(shù)值
text,text16:字符串指針
type:該列的數(shù)據(jù)類型(SQLITE_INTEGER投队,SQLITE_FLOAT枫疆,SQLITE_TEXT,SQLITE_BLOB蛾洛,SQLITE_NULL)
注意:如果對(duì)該列使用了不同與該列本身類型適合的數(shù)據(jù)讀取方法养铸,得到的數(shù)值將是轉(zhuǎn)換過的結(jié)果雁芙。
4. 得到數(shù)據(jù)行中某個(gè)列的數(shù)據(jù)的類型
int sqlite3_column_type(sqlite3_stmt*, int iCol);
返回值:SQLITE_INTEGER,SQLITE_FLOAT钞螟,SQLITE_TEXT兔甘,SQLITE_BLOB,SQLITE_NULL
使用的方法和sqlite3_column_xxx()函數(shù)類似鳞滨。