免費開源的iOS開發學習平臺

SQLite入門:3-數據記錄的操作

在數據庫中,對于數據記錄的操作主要包括4類操作,即:增刪改查。本節中,我們分別介紹基于SQLite數據庫的增刪改查操作的實現方式。

添加數據

在上一章節中,我們創建了聯系人表,現在來添加一條聯系人信息。添加數據需要使用使用INSERT語句。INSERT語句用于向數據庫的某個表中添加新的數據行。INSERT語句語法如下:

INSERT INTO TABLE_NAME (column1, column2,...columnN)]  
VALUES (value1, value2,...valueN);

INSERT語句中,column1, column2,...columnN 是要插入數據的表中的列名。
如果要為表中的所有列添加值,也可以不需要在 SQLite 查詢中指定列名稱。但要確保值的順序與列在表中的順序一致。格式如下:

INSERT INTO TABLE_NAME VALUES (value1,value2,...valueN);

在下方的代碼中,我們添加了insertContact:address:phone方法用來插入新的聯系人。需要注意的是,INSERT語句中插入的字段是TEXT類型,因此在拼接的時候需要加上單引號'。

- (BOOL)insertContact:(NSString *)name address:(NSString *)address phone:(NSString *)phone {
    if (NULL == _db) { //1
        NSLog(@"數據庫不存在,添加聯系人失敗");
        return NO;
    }
    char *errMsg = NULL;
    // 拼接SQL語句
    NSString *sqlString = [NSString stringWithFormat:@"INSERT INTO CONTACTS (name, address, phone) VALUES ('%@', '%@', '%@');", name, address, phone]; //2
    const char *sql = [sqlString UTF8String];
    
    if (sqlite3_exec(_db, sql, NULL, NULL, &errMsg) != SQLITE_OK) { //3
        NSLog( @"添加聯系人失敗");
        return NO;
    }
    NSLog( @"添加聯系人成功");
    return YES;
}

查詢數據

添加完聯系人,我們可以使用通過SELECT語句來查詢聯系人信息。
SELECT語句用于從 SQLite 數據庫的表中獲取數據,并以結果表的形式返回數據,這些結果表也被稱為結果集。SELECT語句的基本語法如下:

SELECT column1, column2, columnN FROM table_name;

在SELECT語句中,column1, column2...是需要獲取的表中的字段。如果需要獲取所有可用的字段,那么可以使用下面的語法:

SELECT * FROM table_name;

在下方的代碼中,我們創建了一個printAllContact方法來查詢出聯系人表中所有的聯系人數據。

- (void)printAllContact {
    if (NULL == _db) { //1
        NSLog(@"數據庫不存在:printAllContact");
        return;
    }
    // 拼接SQL語句
    const char *sql = "SELECT * FROM CONTACTS"; //2
    sqlite3_stmt *stmt = NULL;
    if (sqlite3_prepare_v2(_db, sql, -1, &stmt, nil) == SQLITE_OK) { //3
        while (sqlite3_step(stmt)==SQLITE_ROW) { //4
            char *name = (char *)sqlite3_column_text(stmt, 1); //5
            NSString *nameString = [[NSString alloc] initWithUTF8String:name];
            
            char *address = (char *)sqlite3_column_text(stmt, 2);
            NSString *addressString = [[NSString alloc] initWithUTF8String:address];
            
            char *phone = (char *)sqlite3_column_text(stmt, 3);
            NSString *phoneString = [[NSString alloc] initWithUTF8String:phone];
            
            NSLog(@"name: %@, address: %@, phone: %@", nameString, addressString, phoneString);
        }  
        
        sqlite3_finalize(stmt); //6
    }
}

在上述查詢代碼操作中需要注意以下幾點。

  • sqlite3_prepare_v2是執行語句前編譯語句, 如果返回SQLITE_OK表示查詢成功。
  • sqlite3_step為執行查詢語句,如果返回SQLITE_ROW則表示查詢到記錄。
  • sqlite3_column_text用于獲取查詢到記錄的值。這里需要根據實際的類型使用不同的方法來獲取。
  • sqlite3_finalize語句需要和sqlite3_prepare_v2成對出現,否則會造成內存泄漏。

刪除數據

DELETE語句用于刪除表中已有的記錄。另外,DELETE語句可以添加 WHERE 條件,來刪除所有滿足查詢條件的記錄,同時可以使用 AND 或 OR 運算符來編寫組合條件。如果DELETE語句不添加WHERE條件,表中所有的記錄都會被刪除。帶有 WHERE條件的DELETE語句的基本語法如下:

DELETE FROM table_name
WHERE [condition];

在下方的代碼中,我們編寫deleteAllContactWithName:方法來刪除指定名稱的聯系人。

- (BOOL)deleteAllContactWithName:(NSString *)name {
    if (NULL == _db) { //1
        NSLog(@"數據庫不存在,刪除聯系人失敗");
        return NO;
    }
    char *errMsg = NULL;
    // 拼接SQL語句
    NSString *sqlString = [NSString stringWithFormat:@"DELETE FROM CONTACTS WHERE name='%@'", name]; //2
    const char *sql = [sqlString UTF8String];
    
    if (sqlite3_exec(_db, sql, NULL, NULL, &errMsg) != SQLITE_OK) { //3
        NSLog( @"刪除聯系人失敗");
        return NO;
    }
    NSLog( @"刪除聯系人成功");
    return YES;
}

修改數據

UPDATE語句用于修改表中已有的記錄??梢允褂脦в?WHERE 條件的 UPDATE 語句來更新選定行,否則所有的行都會被更新。帶有 WHERE 條件的 UPDATE 語句的基本語法如下:

UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

在下方的代碼中,我們編寫updatePhone:forContactWithName:方法來更新指定用戶的手機號。

- (BOOL)updatePhone:(NSString *)phone forContactWithName:(NSString *)name {
    if (NULL == _db) { //1
        NSLog(@"數據庫不存在,更新聯系人失敗");
        return NO;
    }
    char *errMsg = NULL;
    // 拼接SQL語句
    NSString *sqlString = [NSString stringWithFormat:@"UPDATE CONTACTS SET phone = '%@' WHERE name='%@'", phone, name]; //2
    const char *sql = [sqlString UTF8String];
    
    if (sqlite3_exec(_db, sql, NULL, NULL, &errMsg) != SQLITE_OK) { //3
        NSLog( @"更新聯系人失敗");
        return NO;
    }
    NSLog( @"更新聯系人成功");
    return YES;
    
}

示例代碼

https://github.com/99ios/13.5.3


日韩av 中文字幕 1_亚洲第一区在线_亚洲V日韩V精品v无码专区_色鬼久久亚洲AV综合