SQLite3是iOS內嵌的數據庫,SQLite3在存儲和檢索大量數據方面很是有效,它使得沒必要將每一個對象都加到內存中。還可以對數據進行負責的聚合,與使用對象執行這些操做相比,得到結果的速度更快。sql
SQLite3使用SQL結構化查詢語言,SQL是與關係數據庫交互的標準語言。數據庫
SQLite3的使用:api
#import <sqlite3.h>函數
//建立和打開數據庫 sqlite3 *database; //若是sqlite3_open的結果是 SQLITE_OK,表示數據庫已經打開成功。 //SQLite3是採用可移植的C,數據庫的文件路徑必須以C字符串(非NSString)的形式進行傳遞。 if (sqlite3_open("/path/databaseFile", &database) != SQLITE_OK)
{
sqlite3_close(database); NSAssert(0, @"Failed to open database");
}
//建立一個新表 NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS " "(ROW INTEGER PRIMARY KEY, FIELD_DATA TEXT);"; char *errorMsg; //sqlite3_exec 針對 SQLite3 運行任何不返回數據的命令 if (sqlite3_exec (database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Error creating table: %s", errorMsg); }
注:sqlite3_exec 執行以後,若是值是SQLITE_OK,則代表執行成功;不然,錯誤信息存儲在errorMsg中。lua
sqlite3_exec這個方法能夠執行那些沒有返回結果的操做,例如建立、插入、刪除等。spa
sqlite3 *database; if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Failed to open database"); } //例子:存儲UITextField的值到數據庫 for (int i = 0; i < 4; i++) { UITextField *field = self.lineFields[i]; //插入操做 char *update = "INSERT OR REPLACE INTO FIELDS (ROW, FIELD_DATA) " "VALUES (?, ?);"; char *errorMsg = NULL; //建立stmt sqlite3_stmt *stmt; //不管針對哪一種數據,任何綁定函數的第一個參數都指向以前在sqlite3_prepare_v2 調用中 使用的sqlite3_stmt if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) { //SQLITE_OK 表示執行成功 /*sqlite3_bind_int(stmt, 1, i);有三個參數: 第一個是sqlite3_stmt類型的變量,在以前的sqlite3_prepare_v2中使用的。 第二個是所約束變量的標籤index。 第三個參數是要加的值。*/ sqlite3_bind_int(stmt, 1, i); sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL); } if (sqlite3_step(stmt) != SQLITE_DONE) NSAssert(0, @"Error updating table: %s", errorMsg); //sqlite3_finalize銷燬前面被sqlite3_prepare建立的準備語句 sqlite3_finalize(stmt); } //sqlite3_close關閉前面使用sqlite3_open打開的數據庫鏈接,任何與這個鏈接相關的準備語句必須在調用這個關閉函數以前被釋放 sqlite3_close(database);
//建立query 和 sqlite3_stmt NSString *query = @"SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW"; sqlite3_stmt *statement; //不管針對哪一種數據,任何綁定函數的第一個參數都指向以前在sqlite3_prepare_v2 調用中 使用的sqlite3_stmt if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { //sqlite3_step用於執行有前面sqlite3_prepare建立的準備語句。這個語句執行到結果的第一行可用的位置。繼續前進到結果的第二行的話,只需再次調用sqlite3_setp()。繼續調用sqlite3_setp()知道這個語句完成,那些不返回結果的語句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只執行一次就返回 while (sqlite3_step(statement) == SQLITE_ROW) { int row = sqlite3_column_int(statement, 0); char *rowData = (char *)sqlite3_column_text(statement, 1);
NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData]; UITextField *field = self.lineFields[row]; field.text = fieldValue;
} //sqlite3_finalize銷燬前面被sqlite3_prepare建立的準備語句 sqlite3_finalize(statement); } //sqlite3_close關閉前面使用sqlite3_open打開的數據庫鏈接,任何與這個鏈接相關的準備語句必須在調用這個關閉函數以前被釋放 sqlite3_close(database);
實際操做時常用叫作約束變量的東西來構造SQL字符串,從而進行插入、查詢或者刪除等。指針
例如,要執行帶兩個約束變量的插入操做,第一個變量是int類型,第二個是C字符串:code
char *sql = "insert into oneTable values (?, ?);"; sqlite3_stmt *stmt; if (sqlite3_prepare_v2(database, sql, -1, &stmt, nil) == SQLITE_OK) { sqlite3_bind_int(stmt, 1, 235); sqlite3_bind_text(stmt, 2, "valueString", -1, NULL); } if (sqlite3_step(stmt) != SQLITE_DONE) NSLog(@"Something is Wrong!"); sqlite3_finalize(stmt);
這裏,sqlite3_bind_int(stmt, 1, 235);有三個參數:sqlite
第一個是sqlite3_stmt類型的變量,在以前的sqlite3_prepare_v2中使用的。對象
第二個是所約束變量的標籤index。
第三個參數是要加的值。
有一些函數多出兩個變量,例如
sqlite3_bind_text(stmt, 2, "valueString", -1, NULL);
這句,第四個參數表明第三個參數中須要傳遞的長度。對於C字符串來講,-1表示傳遞所有字符串。
第五個參數是一個回調函數,好比執行後作內存清除工做。
sqlite3_open():打開數據庫,在操做數據庫以前,首先要打開數據庫。這個函數打開一個sqlite數據庫文件的鏈接而且返回一個數據庫鏈接對象。這個操做同時程序中的第一個調用的sqlite函數,同時也是其餘sqlite api的先決條件。許多的sqlite接口函數都須要一個數據庫鏈接對象的指針做爲它們的第一個參數。
sqlite3_prepare():將sql文本轉換成一個準備語句(prepared statement)對象,同時返回這個對象的指針。這個接口須要一個數據庫鏈接指針以及一個要準備的包含SQL語句的文本。它實際上並不執行(evaluate)這個SQL語句,它僅僅爲執行準備這個sql語句。
sqlite3_step():執行有前面sqlite3_prepare建立的準備語句。這個語句執行到結果的第一行可用的位置。繼續前進到結果的第二行的話,只需再次調用sqlite3_setp()。繼續調用sqlite3_setp()知道這個語句完成,那些不返回結果的語句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只執行一次就返回。
sqlite3_column():執行sqlite3_step()執行一個準備語句獲得的結果集的當前行中返回一個列。每次sqlite3_step獲得一個結果集的列停下後,這個過程就能夠被屢次調用去查詢這個行的各列的值。對列操做是有多個函數,均以sqlite3_column爲前綴。
sqlite3_finalize():銷燬前面被sqlite3_prepare建立的準備語句,每一個準備語句都必須使用這個函數去銷燬以防止內存泄露。在空指針上調用這個函數沒有什麼影響,同時能夠準備語句的生命週期的任一時刻調用這個函數:在語句被執行前,一次或屢次調用sqlite_reset以後,或者在sqlite3_step任何調用以後無論語句是否完成執行
sqlite3_close():關閉前面使用sqlite3_open打開的數據庫鏈接,任何與這個鏈接相關的準備語句必須在調用這個關閉函數以前被釋放