美文网首页
oc sqlite3点简单使用

oc sqlite3点简单使用

作者: 动感新势力fan | 来源:发表于2016-04-21 16:01 被阅读299次

    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];
    

    相关文章

      网友评论

          本文标题:oc sqlite3点简单使用

          本文链接:https://www.haomeiwen.com/subject/toptrttx.html