IOS開發學習筆記iOS資料庫編程是本文要介紹的內容,主要是來瞭解IOS開發中的資料庫的學習,具體內容來看詳解。在IOS開發過程中常常會用到資料庫,而SQLite3是iPhone中支援的資料庫。下面簡單介紹一下iPhone中SQLite3資料庫的用法:
SQLite3是一個輕量級的資料庫,完全使用C語言編寫,使用簡單方便。它是一個嵌入到程式進程的資料庫,和其他一些資料庫MySQL,MS SQL)不同,它沒有獨立的進程。
1、開啟資料庫
首先聲明一個資料庫變數
- sqlite3 *db = NULL;
每一個SQLite3都是一個檔案,開啟一個資料庫只需要調用一次sqlite3_open函數:
- SQLITE_API int sqlite3_open(
- const char *filename, /* Database filename (UTF-8) */
- sqlite3 **ppDb /* OUT: SQLite db handle */
- );
filename是資料庫的路徑,ppDb是指向返回的sqlite3資料庫,返回SQLITE3_OK則表示正常。比如我們開啟Document目錄下的“Test.db”資料庫:
- int result = sqlite3_open([dbPath UTF8String], &db);
- NSAssert(result==SQLITE_OK, @”Can’t open database %@”, dbPath);
注意:如果dbPath路徑下的資料庫不存在,那麼開啟這個資料庫將會建立一個空的資料庫。
2、執行SQL語句
SQLite3有3種執行SQL語句的方法:
通過sqlite3_exec()函數,適用於執行非查詢)語句:如CREATE TABLE、INSERT,REPLACE,DELETE等。
- SQLITE_API int sqlite3_exec(
- sqlite3*, /* An open database */
- const char *sql, /* SQL to be evaluated */
- int (*callback)(void*,int,char**,char**), /* Callback function */
- void *, /* 1st argument to callback */
- char **errmsg /* Error msg written here */
- );
比如我們要建立一個表示個人person)的表,就可以使用sqlite3_exec()函數。person表中包括名字name)、性別gender)、年齡age)和生日birthday)這幾個欄位。代碼如下:
- char *errmsg = NULL;
- result = sqlite3_exec(db, “CREATE TABLE person (”
- “name TEXT,”
- “gender INTEGER,”
- “age INTEGER,”
- “birthday DATE)”, NULL, NULL, &errmsg);
- NSAssert(result==SQLITE_OK, @”Can’t CREATE TABLE: %s”, errmsg);
通過sqlite3_get_table()函數,適用於查詢語句SELECT。由於此函數返回一個字串數組,因此對於要求結果為位元據像資料)的不能用此函數返回。
- SQLITE_API int sqlite3_get_table(
- sqlite3 *db, /* An open database */
- const char *zSql, /* SQL to be evaluated */
- char ***pazResult, /* Results of the query */
- int *pnRow, /* Number of result rows written here */
- int *pnColumn, /* Number of result columns written here */
- char **pzErrmsg /* Error msg written here */
- );
例如我們要查詢person中的所有資料:
- char **table = NULL;
- int row,col;
- result = sqlite3_get_table(db, “SELECT name,age,birthday from person”, &table, &row, &col, &errmsg);
- NSAssert(result==SQLITE_OK, @”SQL ERROR: %s”, errmsg);
那麼字串數組table中就包含所有的表資訊,本例中每行3個元素name、age和birthday),table第一行元素是欄位名字,如table[0]是”name”,table[1]是”age”,table[2]是”birthday”。table的第二行才是實際的資料,如table[3]是”張三”,table[4]是”24″,table[5]是”1981-10-21 12:00:01″。
通過sqlite3_prepare()、sqlite3_step()、sqlite3_bind_xxx()以及sqlite3_finalize()等一系列函數,可以逐行擷取資料,並可以擷取位元據。
sqlite3_prepare()用於編譯一個SQL語句,返回一個sqlite3_stmt結構指標。sqlite3_stmt結構指標用於sqlite3_step()、sqlite3_bind_xxx()以及sqlite3_finalize()等函數中。sqlite3_step()用於將目前記錄指向下一個。sqlite3_bind_xxx()等一系列函數會擷取目前記錄中各個欄位對應的值。最後調用一下sqlite3_finalize()用於釋放一些資源。
3、其他進階應用程式
1)建立記憶體資料庫
通常SQLite3資料庫儲存在磁碟檔案中,所以對資料庫的讀寫等操作就會精彩的對磁碟檔案進行讀寫。SQLite3也可以將資料庫建立在記憶體中,但是要注意建立記憶體的資料是易失的程式退出時記憶體便會釋放)。我們知道磁碟的讀寫比記憶體的讀寫要慢很多很多,有時候我們對讀寫速度要求很高,但是對資料是否時持久儲存並不感興趣,這時使用記憶體資料庫最好不過了。
建立記憶體資料庫很簡單,只需要把開啟資料庫的檔案名稱改為“:memory:”即可。
- int result = sqlite3_open(“:memory:”, &db);
- NSAssert(result==SQLITE_OK, @”Can’t open database %@”, dbPath);
2)建立自訂SQL語句函數
有時候我們想定義一個函數來判斷一個人是否滿足結婚條件男性大於22歲,女性大於20歲),可惜SQL語句中並沒有提供如此複雜的判斷。這時建立一個自訂函數是非常方便的。
- static void db_func_canmarry(sqlite3_context *context, int argc, sqlite3_value **argv){
- int gender = sqlite3_value_int(argv[0]);
- int age = sqlite3_value_int(argv[1]);
- int canmarry = 0;
- if (gender == 0 && age > 22) {
- canmarry = 1;
- }
- else if (gender == 1 && age > 20){
- canmarry = 0;
- }
- sqlite3_result_int(context, canmarry);
- }
定義好函數,把這個函數加入到資料庫SQL語句中。
- sqlite3_create_function(db, “CANMARRY”, 2, SQLITE_UTF8, NULL, &db_func_canmarry, NULL, NULL);
以後我們執行SQL語句SELECT * FROM person WHERE CANMARRY(gender,age) 就可以擷取到所有滿足結婚條件的人。
3)分頁查詢
資料庫查詢時常常碰到需要分頁顯示結果的情況,這時候我們使用SQL語句LIMIT關鍵字就非常方便了。比如返回20行起的10行資料
- SELECT * FROM person WHERE CANMARRY(gender,age) LIMIT 20, 10
小結:IOS開發學習筆記iOS資料庫編程的內容介紹完了,希望通過本文的學習能對你有所協助!關於更多IOS開發的內容,請參考IOS開發頻道。