当前位置: 代码迷 >> SQL >> SQLite的根本封装
  详细解决方案

SQLite的根本封装

热度:64   发布时间:2016-05-05 10:33:55.0
SQLite的基本封装
当我们使用SQLite时,都需要先创建数据库创建数据表,再执行相应地sql语句,这样不利于对数据库操作进行统一管理,也不符合面向对象的思想,当我们的需求发生改变时,例如数据库表名改了,或者是要添加几个字段,这时候就会出现一种四处找数据库操作代码的情况,如果是一处两处还好,但如果是上百处,那就会是一个很大的工作量。所以我们可以来定义一个工具类SQLManager,统一对数据库操作进行管理。
     工具类SQLManager一般都会被定义为单例模式,正常情况下,系统中SQLManager对象只需保存一份,.h文件上对外提供一个获取单例的接口
/** 获取单例对象 */+ (instancetype)shareManage;
.m文件中实现该单例方法
static SQLManager *_instance;+ (instancetype)shareManage{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _instance = [[SQLManager alloc] init];    });    return _instance;}

既然是数据库管理工具类,要对数据库进行操作,同样地我们需要创建数据库还有数据库表,创建只需要一个次,所以可以将创建代码写在initialize方法里面,initialize方法是当这个类第一次被使用的时候就会调用该方法,而且在app的生命周期中只会调用一次
+ (void)initialize{    // 拼接数据库地址    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];    NSString *sqlFile = [path stringByAppendingPathComponent:@"student.sqlite"];    // 打开数据    int result = sqlite3_open(sqlFile.UTF8String, &_db);// [self db]    // 判断是否打开成功    if (result == SQLITE_OK) {        NSLog(@"打开成功");        // 3.1创建表        NSString *sql = @"CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT , name TEXT, age INTEGER, score REAL);";        result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, NULL);    }}
现在我们让工具类向外提供一个方法,用来向数据库插入一条学生数据
/** 插入学生数据 */- (BOOL)insertStudent:(HMStudent *)student;
当然我们首先需要定义一个学生模型来存储数据,学生类中得字段根数据库表中得字段一一对应
@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) int age;@property (nonatomic, assign) double score;@property (nonatomic, assign) int ID;
insertStudent:方法的实现如下
- (BOOL)insertStudent:(HMStudent *)student{    NSString *sql = [NSString stringWithFormat: @"INSERT INTO t_student(age, score, name) VALUES (%d, %f, '%@');", student.age, student.score, student.name];    int result =  sqlite3_exec(_db, sql.UTF8String, NULL, NULL, NULL);    if (result == SQLITE_OK) {        return YES;    }    return NO;}
如此该方法就封装了一个插入操作。
再来到我们需要使用数据库操作的类里面,只需要导入工具类的头文件,就可以以面向对象的方式向数据库中插入一条数据
    Student *stu = [[Student alloc] init];    stu.name = @"lnj";    stu.age = 30;    stu.score = 100.0;    if ([[SQLManager shareManage]insertStudent:stu]) {        NSLog(@"插入成功");    }

以此类推,我们可以封装其他的删除修改操作,以后如果出现什么数据库需求修改时,我们就只用专心的修改工具类就行了,就不用四处的去找数据库相关操作的代码了,而且相比较于之间操作数据库的方式,以上代码更具备阅读性。
查询的方式比较特殊,现在就来简单的实现以下。
同样需要对外提供一个借口
- (NSArray *)query;
该方法用来查询所有的数据,并返回一个学生模型的数组
NSString *sql = @"SELECT * FROM t_student;";    sqlite3_stmt *stemt = NULL;    sqlite3_prepare_v2(_db, sql.UTF8String, -1, &stemt, NULL);    // 判断有没有查询结果    NSMutableArray *arrM = [NSMutableArray array];    while (sqlite3_step(stemt) == SQLITE_ROW) {        // 取出查询到得结果        const unsigned char *name = sqlite3_column_text(stemt, 1);        int age = sqlite3_column_int(stemt, 2);        double score = sqlite3_column_double(stemt, 3);        HMStudent *stu = [[HMStudent alloc] init];        stu.name = [NSString stringWithUTF8String:name];        stu.age = age;        stu.score = score;        [arrM addObject:stu];    }    return arrM;

当我们需要在控制器中获取数据库中得数据时,只要如下几行代码
NSArray *arr = [[SQLManager shareManage] query];    for (Student *stu in arr) {        NSLog(@"%@", stu);    }

so easy!你会发现控制器需要关注的代码越来越少,代码会越来越简洁,这就是封装的魅力!
  相关解决方案