iOS 開發指南 第11章 資料持久化之SQLite 學習

來源:互聯網
上載者:User

標籤:

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 學習

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.