SQLite3 功能
1、獲取sqlite3的數據庫文件路徑
<span style="font-size:14px;">NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database_name"];</span>
2、打開iPhone上的sqlite3的數據庫文件
<span style="font-size:14px;">sqlite3 *database;
sqlite3_open([path UTF8String], &database);</span>
3、準備sql文---sql語句
<span style="font-size:14px;">sqlite3_stmt *stmt;
const char *sql = "SELECT * FROM table_name WHERE pk=? and name=?";
sqlite3_prepare_v2(database, sql, -1, &stmt, NULL);</span>
4、邦定參數
<span style="font-size:14px;">// 邦定第一個int參數
sqlite3_bind_int(stmt, 1, 1);
// 邦定第二個字符串參數
sqlite3_bind_text(stmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);</span>
5、執行sql文
sqlite3_step(stmt);
6、釋放sql文資源
7、關閉iPhone上的sqlite3的數據庫
sqlite3_close(database);
sqlite3 *pdb, 數據庫句柄,跟文件句柄FILE很類似
sqlite3_stmt *stmt, 這個相當於ODBC的Command對象,用於保存編譯好的SQL語句
sqlite3_open(), 打開數據庫
sqlite3_exec(), 執行非查詢的sql語句
sqlite3_prepare(), 準備sql語句,執行select語句或者要使用parameter bind時,用這個函數(封裝了sqlite3_exec).
Sqlite3_step(), 在調用sqlite3_prepare後,使用這個函數在記錄集中移動。
Sqlite3_close(), 關閉數據庫文件
從記錄集字段中獲取數據,如
sqlite3_column_text(), 取text類型的數據。
sqlite3_column_blob(),取blob類型的數據
sqlite3_column_int(), 取int類型的數據
PreparedStatement方式處理SQL請求的過程
特點:可以綁定參數,生成過程。執行的時候像是ADO一樣,每次返回一行結果。
1. 首先建立statement對象:
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. 綁定過程中的參數(如果有沒有確定的參數)
int sqlite3_bind_xxxx(sqlite3_stmt*, int, ...);
第二個int類型參數-表示參數的在SQL中的序號(從1開始)。
第三個參數爲要綁定參數的值。
對於blob和text數值的額外參數:
第四參數是字符串(Unicode 8or16)的長度,不包括結束'\0'。
第五個參數,類型爲void(*)(void*),表示SQLite處理結束後用於清理參數字符串的函數。
沒有進行綁定的未知參數將被認爲是NULL。
3. 執行過程
int sqlite3_step(sqlite3_stmt*);
可能的返回值:
*SQLITE_BUSY: 數據庫被鎖定,需要等待再次嘗試直到成功。
*SQLITE_DONE: 成功執行過程(需要再次執行一遍以恢復數據庫狀態)
*SQLITE_ROW: 返回一行結果(使用sqlite3_column_xxx(sqlite3_stmt*,, int iCol)得到每一列的結果。
再次調用將返回下一行的結果。
*SQLITE_ERROR: 運行錯誤,過程無法再次調用(錯誤內容參考sqlite3_errmsg函數返回值)
*SQLITE_MISUSE: 錯誤的使用了本函數(一般是過程沒有正確的初始化)
4. 結束的時候清理statement對象
int sqlite3_finalize(sqlite3_stmt *pStmt);
應該在關閉數據庫之前清理過程中佔用的資源。
5. 重置過程的執行
int sqlite3_reset(sqlite3_stmt *pStmt);
過程將回到沒有執行之前的狀態,綁定的參數不會變化。
其他函數
1. 得到結果總共的行數
int sqlite3_column_count(sqlite3_stmt *pStmt);
如果過程沒有返回值,如update,將返回0
2. 得到當前行中包含的數據個數
int sqlite3_data_count(sqlite3_stmt *pStmt);
如果sqlite3_step返回SQLITE_ROW,可以得到列數,否則爲零。
3. 得到數據行中某個列的數據
sqlite3_column_xxx(sqlite3_stmt*, int iCol);
在sqlite3_step返回SQLITE_ROW後,使用它得到第iCol列的數據。
其中的xxx代表:
blob:指向保存數據內存的指針
bytes, bytes16: 得到該blob類型數據的大小,或者text轉換爲UTF8/UTF16的字符串長度。
double, int, int64: 數值
text,text16:字符串指針
type:該列的數據類型(SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL)
注意:如果對該列使用了不同與該列本身類型適合的數據讀取方法,得到的數值將是轉換過的結果。
4. 得到數據行中某個列的數據的類型
int sqlite3_column_type(sqlite3_stmt*, int iCol);
返回值:SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL
使用的方法和sqlite3_column_xxx()函數類似。