SQLite封装

</br>

iOS中的数据存储方式主要有:

  • Plist (NSArray/NSDictionary)

  • Preference(偏好设置/NSUserDefaults)

  • NSCoding (NSKeyedArchiver/NSkeyedUnarchiver)

  • SQLite3

  • Core Data

共5种方式, 其中前三种可归纳为文件存储, 适用于简单少量数据存储, 不适用于大批量数据存储; 后两种为数据库存储, 可存储大量数据. 今天主要是对SQLite进行一个简单的封装.首先对SQLite进行简单的一个介绍:

SQLite是目前主流的轻量型嵌入式关系数据库. 它占用资源非常的低, 在嵌入式设备中, 可能只需要几百K的内存就够了, 它的处理速度比Mysql、PostgreSQL还快. 常见的适用于PC端的关系型数据库有Oracle、MySQL、SQL Server、DB2、Sybase, 而在嵌入式\移动客户端中, 我们主要使用的是SQLite. 下面直接上代码:
</br>
DataBaseHandler.h

#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

</br>

DataBaseHandler.m

#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

</br>

以上就是我们对SQLite的一个简单封装. 在实际开发当中, 我们还会经常用到iOS平台的SQLite数据库框架FMDB, FMDB以OC的方式封装了SQLite的C语言API, 大家可以googol一下, 或者参考一下git地址, 或者参考此文章FMDB的用法.

    原文作者:柴茝
    原文地址: https://www.jianshu.com/p/a02479cc5e15
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞