美文网首页
Sqlite封装1-基本封装-SqliteTool

Sqlite封装1-基本封装-SqliteTool

作者: Lovell_ | 来源:发表于2017-08-02 09:39 被阅读60次

    用sqlite封装一个数据库

    总共需要做的一些步骤

    LFSqliteTool基本封装需要做的是:

    公 / 私 API操作 返回
    私有 1.打开数据库
    私有 2.关闭数据库
    暴露 3.执行语句(增删改) 返回是否成功
    暴露 4.查询语句(查) 返回结果集

    导入头文件 #import "sqlite3.h"

    一、私有方法打开数据库关闭数据库供内部调用

    sqlite3 *ppDb = nil;

    1.打开数据库

    根据用户名,拼接上路径,来打开数据库。

    在打开数据库的时候,ppDb就被赋值了,便于被后面使用。

    + (BOOL)openDB:(NSString *)uid {
        NSString *dbName = @"common.sqlite";
        if (uid.length != 0) {
            dbName = [NSString stringWithFormat:@"%@.sqlite", uid];
        }
        
        NSString *dbPath = [kCachePath stringByAppendingPathComponent:dbName];
        
        // 1. 创建&打开一个数据库
        
        return  sqlite3_open(dbPath.UTF8String, &ppDb) == SQLITE_OK;
    }
    
    
    打开sqlite数据库
    2.关闭数据库
    + (void)closeDB {
        sqlite3_close(ppDb);
    }
    
    3.执行sql语句(增删改)

    传入sql语句和用户名。

    + (BOOL)deal:(NSString *)sql uid:(NSString *)uid {
        
        
        // 打开数据库
        if (![self openDB:uid]) {
            NSLog(@"打开失败");
            return NO;
        }
        
        // 2. 执行语句
        BOOL result = sqlite3_exec(ppDb, sql.UTF8String, nil, nil, nil) == SQLITE_OK;
        
        // 3. 关闭数据库
        [self closeDB];
        
        return result;
        
    }
    
    
    4.查询(难点)

    步骤:

    1. 打开数据库

    2. 创建准备语句

      • 使用sqlite3_prepare_v2()函数来创建准备语句,而准备语句放在该函数的第四个参数ppStmt中,类型为sqlite3_stmt
      • sqlite3_stmt类型:将一个SQL命令字符串转换成一条prepared语句,存储在sqlite3_stmt类型结构体中。(即sqlite3_stmt起一个转换作用,把字符串转换成sqlite能用的。)
      • 每次执行sqlite函数,都要用到ppStmt。
    3. 绑定数据(本次可以省略)

    4. 执行查询
      遍历每一行,以下对每一行记录操作:

      • 获取所有列的个数
      • 遍历所有的列
        • 获取列名
        • 获取列值
          • 获取列的类型
          • 根据列的类型, 使用不同的函数, 进行获取
    5. 重置(省略)

    6. 释放资源

    7. 返回一个可变字典(字段 - value)

    这里忽略了绑定和重置两个步骤。

    + (NSMutableArray <NSMutableDictionary *>*)querySql:(NSString *)sql uid:(NSString *)uid {
        [self openDB:uid];
        // 准备语句(预处理语句)
        
        // 1. 创建准备语句
        // 参数1: 一个已经打开的数据库
        // 参数2: 需要中的sql
        // 参数3: 参数2取出多少字节的长度 -1 自动计算 \0
        // 参数4: 准备语句
        // 参数5: 通过参数3, 取出参数2的长度字节之后, 剩下的字符串
        sqlite3_stmt *ppStmt = nil;
        if (sqlite3_prepare_v2(ppDb, sql.UTF8String, -1, &ppStmt, nil) != SQLITE_OK) {
            NSLog(@"准备语句编译失败");
            return nil;
        }
        
        // 2. 绑定数据(省略)
        
        // 3. 执行
        // 大数组
        NSMutableArray *rowDicArray = [NSMutableArray array];
        while (sqlite3_step(ppStmt) == SQLITE_ROW) {
            // 一行记录 -> 字典
            // 1. 获取所有列的个数
            int columnCount = sqlite3_column_count(ppStmt);
            
            NSMutableDictionary *rowDic = [NSMutableDictionary dictionary];
            [rowDicArray addObject:rowDic];
            // 2. 遍历所有的列
            for (int i = 0; i < columnCount; i++) {
                // 2.1 获取列名
                const char *columnNameC = sqlite3_column_name(ppStmt, i);
                NSString *columnName = [NSString stringWithUTF8String:columnNameC];
                
                // 2.2 获取列值
                // 不同列的类型, 使用不同的函数, 进行获取
                // 2.2.1 获取列的类型
                int type = sqlite3_column_type(ppStmt, i);
                // 2.2.2 根据列的类型, 使用不同的函数, 进行获取
                id value = nil;
                switch (type) {
                    case SQLITE_INTEGER:
                        value = @(sqlite3_column_int(ppStmt, i));
                        break;
                    case SQLITE_FLOAT:
                        value = @(sqlite3_column_double(ppStmt, i));
                        break;
                    case SQLITE_BLOB:
                        value = CFBridgingRelease(sqlite3_column_blob(ppStmt, i));
                        break;
                    case SQLITE_NULL:
                        value = @"";
                        break;
                    case SQLITE3_TEXT:
                        value = [NSString stringWithUTF8String: (const char *)sqlite3_column_text(ppStmt, i)];
                        break;
                        
                    default:
                        break;
                }
                
                [rowDic setValue:value forKey:columnName];
     
            }
        }
        
        
        // 4. 重置(省略)
        
        // 5. 释放资源
        sqlite3_finalize(ppStmt);
        
        [self closeDB];
        
        return rowDicArray;
    }
    
    
    
    Snip20170802_97.png

    相关文章

      网友评论

          本文标题:Sqlite封装1-基本封装-SqliteTool

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