標籤:
1 SQLite是無資料類型的資料庫,就是欄位不用指定類型。但從編程規範上說,應該在Create Table語句中指定資料類型:INTERGER 有符號的整數類型 REAL 浮點類型 TEXT 字串類型 BLOB二進位類型
2 建立資料庫:
準備:添加SQLite3庫到工程中 TARGETS-Link Binary With Libraries-添加libsqlite3.dylib
使用sqlite3_open開啟資料庫-使用sqlite3_exec執行Creat Table語句,建立資料庫-使用sqlite3_close釋放資源
- (void)createEditableCopyOfDatabaseIfNeeded { NSString *writableDBPath = [self applicationDocumentsDirectoryFile]; const char* cpath = [writableDBPath UTF8String];將路徑轉變為C字串 if (sqlite3_open(cpath, &db) != SQLITE_OK) { sqlite3 *db;db是資料庫指標 sqlite3_close(db); NSAssert(NO,@"資料庫開啟失敗。"); } else { char *err;
構建SQL語句 NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS Note (cdate TEXT PRIMARY KEY, content TEXT);"]; const char* cSql = [sql UTF8String]; 執行參數分別是 sqlite3指標變數 要執行的SQL語句 要回調的函數 要回呼函數的參數 執行出錯的字串 if (sqlite3_exec(db, cSql,NULL,NULL,&err) != SQLITE_OK) {順序是 先執行在判斷 sqlite3_close(db); NSAssert(NO, @"建表失敗"); } sqlite3_close(db); }}
**********
NSAssert()只是一個宏,用於開發階段偵錯工具中的Bug,通過為NSAssert()傳遞條件運算式來斷定是否屬於Bug,滿足條件返回真值,程式繼續運行,如果返回假值,則拋出異常,並切可以自訂異常描述。NSAssert()是這樣定義的:
#define NSAssert(condition, desc)
condition是條件運算式,值為YES或NO;desc為異常描述,通常為NSString。當conditon為YES時程式繼續運行,為NO時,則拋出帶有desc描述的異常資訊。NSAssert()可以出現在程式的任何一個位置。
**********
3 查詢資料
查詢條件使用where語句,在程式中需要動態綁定參數給where語句
使用sqlite3_open開啟資料庫-使用sqlite3_prepare_v2預先處理SQL語句-使用sqlite3_bind_text綁定參數-使用sqlite3_step執行SQL語句,遍曆結果集-使用sqlite3_column_text提取欄位資料-使用sqlite3_finalize和sqlite3_close釋放資源
//按照主鍵查詢資料方法-(Note*) findById:(Note*)model{ NSString *path = [self applicationDocumentsDirectoryFile]; const char* cpath = [path UTF8String]; if (sqlite3_open(cpath, &db) != SQLITE_OK) { sqlite3_close(db); NSAssert(NO,@"資料庫開啟失敗。"); } else { NSString *sql = @"SELECT cdate,content FROM Note where cdate =?";?代表動態參數 const char* cSql = [sql UTF8String]; sqlite3_stmt *statement; //預先處理過程 目的是將SQL語句編譯成二進位代碼,提高SQL語句的執行速度。
第三個參數開始 代表全部的SQL字串長度 語句對象:通過語句對象可以執行SQL語句 SQL語句沒有執行的那部分
if (sqlite3_prepare_v2(db, cSql, -1, &statement, NULL) == SQLITE_OK) { //準備參數 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *strDate = [dateFormatter stringFromDate:model.date]; const char* cDate = [strDate UTF8String]; //綁定參數開始
參數:指標 序號:從1開始 字串(參數) 字串長度 函數指標
sqlite3_bind_text(statement, 1, cDate, -1, NULL); //執行 if (sqlite3_step(statement) == SQLITE_ROW) {若函數傳回值等於SQLITE_ROW,表示還有其他的行沒有遍曆 char *bufDate = (char *) sqlite3_column_text(statement, 0);第二個參數用於指定select欄位的索引 NSString *strDate = [[NSString alloc] initWithUTF8String: bufDate]; NSDate *date = [dateFormatter dateFromString:strDate]; char *bufContent = (char *) sqlite3_column_text(statement, 1); NSString * strContent = [[NSString alloc] initWithUTF8String: bufContent]; Note* note = [[Note alloc] initWithDate:date content:strContent]; sqlite3_finalize(statement); sqlite3_close(db); return note; } } sqlite3_finalize(statement); sqlite3_close(db); } return nil;}
4 修改資料
涉及的SQL語句有insert update delete
使用sqlite3_open開啟資料庫-使用sqlite3_prepare_v2預先處理SQL語句-使用sqlite3_bind_text綁定參數-使用sqlite3_step執行SQL語句-使用sqlite3_finalize和sqlite3_close關閉資料庫
//插入Note方法-(int) create:(Note*)model{ NSString *path = [self applicationDocumentsDirectoryFile]; const char* cpath = [path UTF8String]; if (sqlite3_open(cpath, &db) != SQLITE_OK) { sqlite3_close(db); NSAssert(NO,@"資料庫開啟失敗。"); } else { NSString *sql = @"INSERT OR REPLACE INTO note (cdate, content) VALUES (?,?)"; const char* cSql = [sql UTF8String]; sqlite3_stmt *statement; //預先處理過程 if (sqlite3_prepare_v2(db, cSql, -1, &statement, NULL) == SQLITE_OK) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *strDate = [dateFormatter stringFromDate:model.date]; const char* cDate = [strDate UTF8String]; const char* cContent = [model.content UTF8String]; //綁定參數開始 sqlite3_bind_text(statement, 1, cDate, -1, NULL); sqlite3_bind_text(statement, 2, cContent, -1, NULL); //執行插入 if (sqlite3_step(statement) != SQLITE_DONE) { NSAssert(NO, @"插入資料失敗。"); } } sqlite3_finalize(statement); sqlite3_close(db); } return 0;}//刪除Note方法-(int) remove:(Note*)model{ NSString *path = [self applicationDocumentsDirectoryFile]; const char* cpath = [path UTF8String]; if (sqlite3_open(cpath, &db) != SQLITE_OK) { sqlite3_close(db); NSAssert(NO,@"資料庫開啟失敗。"); } else { NSString *sql = @"DELETE from note where cdate =?"; const char* cSql = [sql UTF8String]; sqlite3_stmt *statement; //預先處理過程 if (sqlite3_prepare_v2(db, cSql, -1, &statement, NULL) == SQLITE_OK) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *strDate = [dateFormatter stringFromDate:model.date]; const char* cDate = [strDate UTF8String]; //綁定參數開始 sqlite3_bind_text(statement, 1, cDate, -1, NULL); //執行 if (sqlite3_step(statement) != SQLITE_DONE) { NSAssert(NO, @"刪除資料失敗。"); } } sqlite3_finalize(statement); sqlite3_close(db); } return 0;}//修改Note方法-(int) modify:(Note*)model{ NSString *path = [self applicationDocumentsDirectoryFile]; const char* cpath = [path UTF8String]; if (sqlite3_open(cpath, &db) != SQLITE_OK) { sqlite3_close(db); NSAssert(NO,@"資料庫開啟失敗。"); } else { NSString *sql = @"UPDATE note set content=? where cdate =?"; const char* cSql = [sql UTF8String]; sqlite3_stmt *statement; //預先處理過程 if (sqlite3_prepare_v2(db, cSql, -1, &statement, NULL) == SQLITE_OK) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *strDate = [dateFormatter stringFromDate:model.date]; const char* cDate = [strDate UTF8String]; const char* cContent = [model.content UTF8String]; //綁定參數開始 sqlite3_bind_text(statement, 1, cContent, -1, NULL); sqlite3_bind_text(statement, 2, cDate, -1, NULL); //執行 if (sqlite3_step(statement) != SQLITE_DONE) { NSAssert(NO, @"修改資料失敗。"); } } sqlite3_finalize(statement); sqlite3_close(db); } return 0;}
iOS 開發指南 第11章 資料持久化之SQLite 學習