SQLite3是iOS內嵌的資料庫,SQLite3在存儲和檢索大量數據方面非常有效,它使得不必將每個對象都加到記憶體中。還能夠對數據進行負責的聚合,與使用對象執行這些操作相比,獲得結果的速度更快。 SQLite3使用SQL結構化查詢語言,SQL是與關係資料庫交互的標準語言。 SQLite3的使用: 1 ...
SQLite3是iOS內嵌的資料庫,SQLite3在存儲和檢索大量數據方面非常有效,它使得不必將每個對象都加到記憶體中。還能夠對數據進行負責的聚合,與使用對象執行這些操作相比,獲得結果的速度更快。
SQLite3使用SQL結構化查詢語言,SQL是與關係資料庫交互的標準語言。
SQLite3的使用:
1、導入頭文件
#import <sqlite3.h>
2、創建或者打開資料庫
//創建和打開資料庫 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");
}
3、創建一個表
//創建一個新表 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中。
sqlite3_exec這個方法可以執行那些沒有返回結果的操作,例如創建、插入、刪除等。
4、對錶進行操作
4.1存儲數據到資料庫
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);
4.2 對資料庫進行查詢操作
//創建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);
5、使用約束變數
實際操作時經常使用叫做約束變數的東西來構造SQL字元串,從而進行插入、查詢或者刪除等。
例如,要執行帶兩個約束變數的插入操作,第一個變數是int類型,第二個是C字元串:
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);有三個參數:
第一個是sqlite3_stmt類型的變數,在之前的sqlite3_prepare_v2中使用的。
第二個是所約束變數的標簽index。
第三個參數是要加的值。
有一些函數多出兩個變數,例如
sqlite3_bind_text(stmt, 2, "valueString", -1, NULL);
這句,第四個參數代表第三個參數中需要傳遞的長度。對於C字元串來說,-1表示傳遞全部字元串。
第五個參數是一個回調函數,比如執行後做記憶體清除工作。
6、SQLite3中常用的函數
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打開的資料庫連接,任何與這個連接相關的準備語句必須在調用這個關閉函數之前被釋放