c_cpp sqlite3的简易封装

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp sqlite3的简易封装相关的知识,希望对你有一定的参考价值。

//
//  DataBaseHandler.m
//  代码:http://www.jianshu.com/p/a02479cc5e15
//

#import "DataBaseHandler.h"

@implementation DataBaseHandler

+ (DataBaseHandler *)shareInstance
{
    // 当第一次执行的时候会产生一个空指针
    static DataBaseHandler *dbHandler = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 对指针进行判断, 当第一次执行的时候创建一个对象
        if (dbHandler == nil) {
            dbHandler = [[DataBaseHandler alloc] init];
        }
    });
    
    // 无论是创建的和已经存在的, 都在这里直接return除去
    return dbHandler;
}


- (void)openDb:(NSString *)dbname text:(NSString *)text
{
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *dbPath = [docPath stringByAppendingString:dbname];
    
    // 参数1: 数据库文件存储的路径
    // 参数2: 数据库dbPoint指针地址
    // 返回值: 执行sqlite函数的结果(int类型)
    int result = sqlite3_open([dbPath UTF8String], &dbPoint);
    
    // 利用封装的方法判断结果
    [self judgeResult:result text:text];
}



- (void)executeNonReturnValue:(NSString *)sql text:(NSString *)text
{
    int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
    [self judgeResult:result text:text];
}



- (NSArray *)executeHaveReturnValue:(NSString *)sql
{
    // 创建一个可变数组, 用于存储数据
    NSMutableArray *rows=[NSMutableArray array];
    
    // 创建一个数据库的替身, 存储对数据库的所有操作
    sqlite3_stmt *stmt = nil;
    
    /**
     *  让数据库执行sql语句, 并把结果保存到stmt中
     *
     *  @param dbPoint     数据库指针
     *  @param UTF8String] sql语句
     *  @param -1          限制sql语句的长度(如果是-1, 就是不限制)
     *  @param stmt        替身指针的地址
     *  @param NULL        空
     *
     */
    int result = sqlite3_prepare_v2(dbPoint, [sql UTF8String], -1, &stmt, NULL);
    
    // 判断是否正确
    if (SQLITE_OK == result) {
        
        // 当sql执行成功, 遍历数据
        // 循环遍历所有的结果, 每次遍历到一条数据, 都会返回sqlite_row, 如果没有数据了, 就不会返回SQLITE_ROW, 跳出循环
        while (SQLITE_ROW == sqlite3_step(stmt)) {
            
            // 取int类型的数据
            int columnCount = sqlite3_column_count(stmt);
            
            // 创建一个可变字典, 用来存储数据
            NSMutableDictionary *dic=[NSMutableDictionary dictionary];
            
            for (int i = 0; i < columnCount; i++) {
                
                // 在循环体中去按列取数据
                // 取得列名
                const char *name = sqlite3_column_name(stmt, i);
                
                // 取得某列的值
                const unsigned char *value = sqlite3_column_text(stmt, i);
                
                // 将char *字符串转为NSString字符串
                dic [[NSString stringWithUTF8String:name]] = [NSString stringWithUTF8String:(const char *) value];
            }
            
            [rows addObject:dic];
        }
    }
    
    // 销毁stmt替身, 把里面的操作和结果写入本地sqlite文件
    sqlite3_finalize(stmt);
    
    return rows;
    
}



- (void)judgeResult:(int)result text:(NSString *)text
{
    if (result == SQLITE_OK) {
        NSLog(@"%@成功", text);
    } else {
        NSLog(@"错误代码: %d", result);
        NSLog(@"%@失败",text);
    }
}

@end
//
//  DataBaseHandler.h
//  代码:http://www.jianshu.com/p/a02479cc5e15
//

#import <Foundation/Foundation.h>
#import <sqlite3.h>

@interface DataBaseHandler : NSObject
{
    sqlite3 *dbPoint;
}

// 单例的创建方法
+ (DataBaseHandler *)shareInstance;


/**
 *  打开数据库
 *
 *  @param dbname 数据库名称
 *
 *  @text 哪个方法
 */
- (void)openDb:(NSString *)dbname text:(NSString *)text;


/**
 *  执行无返回值的sql
 *
 *  @param sql sql语句
 *
 *  @text 哪个方法
 */
- (void)executeNonReturnValue:(NSString *)sql text:(NSString *)text;


/**
 *  执行有返回值的sql
 *
 *  @param sql sql语句
 *
 *  @return 查询结果
 */
- (NSArray *)executeHaveReturnValue:(NSString *)sql;


/**
 *  判断数据库方法执行结果
 *
 *  @param result 调用数据库方法返回的结果
 *
 *  @text 哪个方法
 */
- (void)judgeResult:(int)result text:(NSString *)text;



@end

以上是关于c_cpp sqlite3的简易封装的主要内容,如果未能解决你的问题,请参考以下文章

rudonSqlite{} - SQLite3简易操作类 - SQLite增删改查 - PHP工具

rudonSqlite{} - SQLite3简易操作类 - SQLite增删改查 - PHP工具

rudonSqlite{} - SQLite3简易操作类 - SQLite增删改查 - PHP工具

c_cpp sqlite3的运行时可加载扩展添加extended_errorcode()函数(但失败了。不要使用它!)

c_cpp 141.链表循环 - 简易 - 2018.7.30

iOS之Sqlite3封装