使用iOS原生sqlite3框架对sqlite数据库进行操作
一、引言
sqlite数据库是一种小型数据库,由于其小巧与简洁,在移动开发领域应用深广,sqlite数据库有一套完备的sqlite语句进行管理操作,一些常用的语句和可视化的开发工具在上篇博客中有介绍,地址如下:
在iOS的原生开发框架中可以对sqlite数据库进行很好的支持,这个框架中采用C风格且通过指针移动进行数据的操作,使用起来有些不便,我们可以对一些数据库的常用操作进行一些面向对象的封装。
二、libsqlite3系统库中操作数据库的常用方法
libsqlite3是对sqlite数据库进行操作的系统库,在使用前,我们需要先导入,点击Xcode的Build Phases标签,展开Link Binary With Libraries,点击+号,在弹出的窗口中搜索libsqlite3.0,将其导入进工程,过程如下图:
在需要操作sqlite数据的文件中导入如下头文件:
数据库文件的操作是由一个sqlite3类型的指针操作管理的,如下方法进行数据库的打开:
sqlite3_open方法返回一个int值,实际上,在使用libsqlite3框架中的大多方法时都会返回一个int值,这个int值代表着方法执行的相应结果状态,这些状态再sqlite3.h文件中通过宏来定义,列举如下:
执行非查询类的语句,例如创建,添加,删除等操作,使用如下方法:
sqlite3_exec方法中第一个参数为成功执行了打开数据库操作的sqlite3指针,第二个参数为要执行的sql语句,最后一个参数为错误信息字符串。
执行查询语句的方法比较复杂,通过如下方法:
stmt是一个数据位置指针,标记查询到数库的数据位置,sqlite3_prepare_v2()方法进行数据库查询的准备工作,第一个参数为成功打开的数据库指针,第二个参数为要执行的查询语句,第三个参数为sqlite3_stmt指针的地址,这个方法也会返回一个int值,作为标记状态是否成功。
sqlite3_step方法对stmt指针进行移动,会逐行进行移动,这个方法会返回一个int值,如果和SQLITE_ROW宏对应,则表明有此行数据,可以通过while循环来对数据进行读取。
sqlite3_column_XXX()是取行中每一列的数据,根据数据类型的不同,sqlite3_column_XXX()有一系列对应的方法,这个方法中第一个参数是stmt指针,第二个参数为列序号。
sqlite3_finalize()方法对stmt指针进行关闭。
三、面向对象的sqlite数据库操作框架封装
网上不乏有许多优秀的第三方sqlite数据库使用框架,FFDM就是其中之一,并且apple自带的coreData也十分优秀。这篇博客中所述内容并不全面,代码也并不十分完善健壮,封装出来的代码除了能够完成基本的数据库操作外,更多主要是对设计思路的示例。
1.面向对象的sqlite管理类的设计思路
为了便于使用,在设计时,我们尽量将libsqlite3中的方法不暴漏在使用层,通过面向应用的接口来进行方法的设计,设计思路类图如下:
图中,文件管理中心对文件进行存取删改管理,不暴漏在外,数据库管理中心负责对数据库的创建,删除打开等操作,具体的数据操作由数据库操作对象来完成。
2.文件管理中心方法的编写
文件管理中心主要负责对数据库文件的存取,可以实现如下方法:
YHBaseCecheCenter.h
YHBaseCecheCenter.m
在iOS系统中因为其沙盒结构的限制,数据库必须方法documents目录下才能正常打开使用。
3.数据库管理中心的设计
数据库管理中心主要负责对数据库的宏观操作,采用类方法的设计模式,如下
YHBaseSQLiteManager.h
YHBaseSQLiteManager.m
4.数据库操作对象
将操作数据库的核心方法封装在这个类中:
YHBaseSQLiteContext.h
YHBaseSQLiteContext.m
5.错误信息类可以将数据库操作中的异常抛出提示开发者
YHBaseSQLError.h
还有一个头文件中定义了sqlite数据库支持的数据类型和排序宏定义:
YHBaseSQLTypeHeader.h
四、使用
在使用时,直接调用context的相应方法操作数据库即可,例如:
上面的代码将查询textDataBase数据库中MySQL表里所有age列大于18的数据,并按照age从小到大进行排序,数据结果在回调的dataArray中。