一. DML语句的基本使用
在Xcode中, 执行DML语句, 与之前的DDL语句的方法相同
为SQLiteTool工具类添加一个方法, 专门用于接收外界的SQL语句, 然后执行数据库的代码
一定要确保外界传入的sql语句无误
// 执行sql语句 - (void)excuteSQL:(NSString *)sql { if (sqlite3_exec(_db, sql.UTF8String, nil, nil, nil) != SQLITE_OK) { NSLog(@"执行失败"); return; } else { NSLog(@"执行成功"); } }
DML语句
使用之前, 要确定数据库中有响应的表, 否则会出现异常
其次, 要确定表格中, 有指定的column, 否则也会出现异常
#import "Human.h" #import "SQLiteTool.h" @implementation Human // 插入数据 - (void)insertHuman { // 1. 编写sql语句 insert into t_stu(name, age, score) values ('\(name)', \(age), \(score)) NSString *sql = [NSString stringWithFormat:@"insert into T_human(name, age, height) values('%@', %li, %f)", self.name, self.age, self.height]; // 2. 执行SQL [[SQLiteTool shareInstance] excuteSQL:sql]; } // 删除数据 - (void)deleteHuman { // 1. 编写sql语句 NSString *sql = [NSString stringWithFormat:@"delete from T_human where name = '%@'", self.name]; // 2. 执行 [[SQLiteTool shareInstance] excuteSQL:sql]; } // 更新数据 - (void)updateHuman { NSString *sql = [NSString stringWithFormat:@"update T_human set name = '%@', age = %li, height = %f", self.name, self.age, self.height]; [[SQLiteTool shareInstance] excuteSQL:sql]; } @end
二. DML – insert语句绑定参数的方式
准备语句对象:
- 准备语句对象, 代表一个简单SQL语句对象的实例, 这个对象一般被称为准备语句
- 准备语句的插入方案, 对于多条数据来说有很大很大的性能提升, 但是对于1条数据来说, 只是一个繁琐的写法
- 鄙人会在下一篇文章中介绍插入语句的各种优化
准备语句对象的创建
// 插入数据 - (void)insertHumanBind { // 1. 留给准备语句用的语句 NSString *sql = @"insert into T_human(name, age, height) values(?, ?, ?)"; // 2. 创建准备语句 sqlite3 *db = [SQLiteTool shareInstance].db; sqlite3_stmt *stmt = nil; // 准备语句的引用指针 /* 创建编译一个sql字符串, 即sql准备语句 db 已经打开的数据库的引用 sql.UTF8String sql语句字符串 -1 代表从sql字符串中取出的长度, -1代表自动计算 &stmt 预先准备的"准备语句的地址" 参数5 根据参数3给定的长度, 从参数2中取出固定长度字符串之后剩下的字符串 */ if (sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, nil) != SQLITE_OK) { NSLog(@"编译失败"); return; } // 3. 绑定参数 /* 绑定文本 参数1: 准备语句 参数2: 绑定的索引(从1开始) 参数3: 绑定的值 参数4: 代表从参数3中取出的长度, -1为自动计算 参数5: 代表参数的处理方式 SQLITE_STATIC 将参数当做一个静态的值, 不会被释放 SQLITE_TRANSIENT 将参数当做一个临时值, 有可能释放(对这个参数做一次引用, 并且在适当的时候自动释放掉) */ sqlite3_bind_text(stmt, 1, @"lilchunjiang".UTF8String, -1, SQLITE_TRANSIENT); sqlite3_bind_int(stmt, 2, 16); sqlite3_bind_double(stmt, 3, 99); // 4. 执行, 这里要判断执行是否完成 if (sqlite3_step(stmt) != SQLITE_DONE) { NSLog(@"执行失败"); return; } // 5. 重置, 将绑定的值清空 sqlite3_reset(stmt); // 6. 销毁 sqlite3_finalize(stmt); }