iOS —— SQLite3 功能使用詳解 (三)

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文資源

 

sqlite3_finalize(stmt);

 

7、關閉iPhone上的sqlite3的數據庫

sqlite3_close(database);


先創建一個數據庫,然後查詢其中的內容。2個重要結構體和5個主要函數:

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()函數類似。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章