免费开源的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