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!你会发现控制器需要关注的代码越来越少,代码会越来越简洁,这就是封装的魅力!

时间: 2024-08-03 17:04:23

SQLite的基本封装的相关文章

sqlite安装与封装后编译

========================安装sqlite=================官网下载安装包*.tar.gz格式./configure --prefix=/usr/server/sqlit 安装包目录makemake install 测试安装成功 sqlite3 test.db =======================编译====================编译时 加入参数 -I /usr/server/sqlite/include-L /usr/server/sq

Android Sqlite 工具类封装

鉴于经常使用 Sqlite 数据库做数据持久化处理,进行了一点封装,方便使用. 该封装类主要支持一下功能 支持多用户数据储存 支持 Sqlite数据库升级 支持传入 Sql 语句建表 支持 SQLiteDatabase 基本操作.比如:execSQL.rawQuery.insert等等 解决了数据库并发问题 先贴上封装类代码 /** * * @ClassName: DataBaseOpenHelper * @Description: 数据库工具类 * @author lhy * @date 20

Android SQLite DB的封装

DbOpenHelper: package com.example.db_demo01.DB; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DbOpenHelper extends SQLiteOpenHelper { private static String

Swift使用FMDB操作SQLite

SQLite大家都懂的.本地数据库,在移动设备上使用广泛.IOS平台上自然也少不了它.最近自己折腾一个小App的时候需要使用sqlite本地数据库,上Github搜了下IOS下对SQLite的三方封装有个星星很多的FMDB.不过是Obiect-C的库,我是使用Swift的,本以为不能用了,不过后折腾了下发现在Swift下使用oc的库非常简单.下面我就介绍下如何在Swift下使用oc的FMDB库. 1.下载 第一步自然是去下载FMDB了.https://github.com/ccgus/fmdb

数据持久化-CoreData、SQLite、FMDB

1.CoreData 1.1 CoreData概述 1)Core data 是数据持久存储的最佳方式 2)Core Data 基于model-view-controller(mvc)模式下,为创建分解的cocoa应用程序提供了一个灵活和强大的数据模型框架. 3)Core Data可以是你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它. Core Data提供了基础结构去处理常用的功能,例如:保存,恢复,撤销和重做,允许你在app中继续创建新的任务.在使用 Core Da

iOS-FMDB事务操作SQLite数据库

批量操作数据库的时候,我们经常会用到事务处理.事务是访问并可能更新数据库各种数据项的数据单元(unit),是恢复和并发的控制的基本单位. 事务具有四个属性. - 原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做. - 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态.一致性与原子性是密切相关的. - 隔离性(isolation):一个事务的执行不能被其他事务干扰.即一个事务内部的操作及使用的数据对并发的

FMDB配合sqlite使用

转载至:http://www.linuxidc.com/Linux/2014-02/97020p16.htm iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,

swift 学习数据库之 sqlite

1. sqlite数据库 查看 sqlite manage工具 语法:http://www.runoob.com/sqlite/sqlite-syntax.html 封装:sqlitedb:https://github.com/pokay/SQLiteDB sqlite.swifthttps://github.com/pokay/SQLite.swift swift + xcode 7.3.1 +sqlite3.0 1. .db数据库 2. 工程中间 “Build Phases” -- "Lin

GitHub开源:SQLite 增强组件 Sheng.SQLite.Plus

Github:https://github.com/iccb1013/Sheng.SQLite.Plus Sheng.SQLite.Plus 是一个对直接使用 ADO.NET 方式操作 SQLite 数据库的一个增强组件,它的操作方式介于 Entity Framework 和 ADO.NET 之间,是用于 SQLite 的高度自由和高开发效率的数据库访问层组件. + 支持所有 ADO.NET 原生操作 + 由开发人员定义模型并解除与数据库表一一对应的关系,可由开发人员灵活指定映射关系.同一张表可