1.创建或者打开数据库
static sqlite3 *_db;
+ (void)initialize
{
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
// 拼接文件名
NSString *filePath = [cachePath stringByAppendingPathComponent:@"contact.sqlite"];
// 打开数据库
if (sqlite3_open(filePath.UTF8String, &_db) == SQLITE_OK) {
NSLog(@"打开成功");
}else{
NSLog(@"打开失败");
}
// 创建表格
NSString *sql = @"create table if not exists t_contact (id integer primary key autoincrement,name text,phone text);";
char *error;
sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &error);
if (error) {
NSLog(@"创建表格失败");
}else{
NSLog(@"创建表格成功");
}
}
2.增删改 oc封装方法
+ (BOOL)execWithSql:(NSString *)sql
{
BOOL flag;
char *error;
sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &error);
if (error) {
flag = NO;
NSLog(@"%s",error);
}else{
flag = YES;
}
return flag;
}
注意
sqlite3_exec()可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据
sqlite3_exec()还可以执行的语句:
开启事务:begin transaction;
回滚事务:rollback;
提交事务:commit;
带占位符带数据插入
char *sql = "insert into t_person(name, age) values(?, ?);";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, "母鸡", -1, NULL);
sqlite3_bind_int(stmt, 2, 27);
}
if (sqlite3_step(stmt) != SQLITE_DONE) {
NSLog(@"插入数据错误");
}
sqlite3_finalize(stmt);
代码解析:
sqlite3_prepare_v2()返回值等于SQLITE_OK,说明SQL语句已经准备成功,没有语法问题
sqlite3_bind_text():大部分绑定函数都只有3个参数
第1个参数是sqlite3_stmt *类型
第2个参数指占位符的位置,第一个占位符的位置是1,不是0
第3个参数指占位符要绑定的值
第4个参数指在第3个参数中所传递数据的长度,对于C字符串,可以传递-1代替字符串的长度
第5个参数是一个可选的函数回调,一般用于在语句执行后完成内存清理工作
sqlite_step():执行SQL语句,返回SQLITE_DONE代表成功执行完毕
sqlite_finalize():销毁sqlite3_stmt *对象
3.查找
+ (NSArray *)contactWithSql:(NSString *)sql
{
NSMutableArray *arrM = [NSMutableArray array];
// 准备查询,生成句柄,操作查询数据结果
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(_db, sql.UTF8String, -1, &stmt, NULL) == SQLITE_OK) {
// 执行句柄
while (sqlite3_step(stmt) == SQLITE_ROW) {
NSString *name = [NSString stringWithUTF8String:sqlite3_column_text(stmt, 1)];
NSString *phone = [NSString stringWithUTF8String:sqlite3_column_text(stmt, 2)];
Contact *c = [Contact contactWithName:name phone:phone];
[arrM addObject:c];
}
}
return arrM;
}
代码解析
sqlite3_step()返回SQLITE_ROW代表遍历到一条新记录
sqlite3_column_*()用于获取每个字段对应的值,第2个参数是字段的索引,从0开始
4.模糊查询
// o select * from t_contact where name like '%searchText%' or phone like '%searchText%'
// % 在stringWithFormat中有特殊意思
// %% == %
// 输入一个文字,进行模糊查询,查看下名字或者电话是否包含文字
NSString *sql = [NSString stringWithFormat:@"select * from t_contact where name like '%%%@%%' or phone like '%%%@%%';",searchText,searchText];
网友评论