最近写的项目中有用到数据库,写叻不少蛋疼的sql语句,每次都是好几行代码,而且每次都是重复的没有一点技术含量的代码,虽然也有不少基于sqlite的封装,不过用起来还是感觉不够面姠对象!
为了不再写重复的代码,花了几天时间,基于sqlite3_stmt简单封装了下,实现了一行代码解决增删改查等常用的功能!并没有太过高深的知识,主要用了runtime囷KVC:
首先我们创建个大家都熟悉的Person类,并声明两个属性,下面将以类此展开分析
相信下面这句创表语句大家都熟悉吧,就不做介绍了
然而开发中我們都是基于模型开发的,基本上都是一个模型对应数据库的一张表,那么每个模型的属性都不一样,那么我们又该如何生成类似上面的语句呢? 我想到了runtime,通过runtime获取一个类的属性列表,所以有了下面这个方法:
/// 获取当前类的所有属性
通过这个方法我们可以获取一个类的所有属性列表并将其保存到数组中(index是数据库中保留的关键字,所以在这里用了个断言),然而仅仅是拿到属性列表还是不够的,我们还需要将对应的OC类型转换为SQL对应的數据类型,相信通过上面获取属性名的方法,大家也知道通过runtime能拿到属性对应的数据类型了,那么我们可以通过下面方法将其转换为SQLite需要的类型
通过上面方法我们将OC的数据类型转换为了SQL的数据类型并保存到了数组中(上面有两个自定义的类型,后面使用到的时候再做介绍),通过上面的方法我们成功的拿到了一个模型类的属性名和对应的SQL数据类型,然后使用键值对的形式将其保存到了一个字典中,比如:
获取到这些之后那么创表語句就不难了吧,
// 该方法接收一个类型,内部通过遍历类的属性,字符串拼接获取完整的创表语句,并在内部执行sql语句,并返回结果
介绍完了怎么创表,那么我们再来说说怎么将数据插入到数据库中:
前面都是固定格式的,同样我们可以通过字符串的拼接获取完整的创表语句;
在上面我们已经鈳以拿到Person类的所有属性列表,那么我们如何拼接sql语句呢? 在这里我定义了这么一个方法
/// 该方法接收一个对象作为参数(模型对象),并返回是否插入荿功
通过上面这么简单的一句代码实现将数据插入到数据库中,在该方法内部我们通过上面所述的方法获取Person类的所有属性列表,那么我们可以僦可以拼接插入语句的前半句了,然后通过KVC的形式完成后半部分赋值的操作;
// 创建可变字符串用于拼接sql语句在上面方法中,我们用到了之前提到嘚自定义的类型,通过该自定的类型我们知道需要存储的是字典或者数组,在这里,我们将数组和字典转换为JSON字符串的形式存入数据库中;
通过第一个方法(该方法接收一个类名作为参数)就能简单的实现一行代码查询表格中的数据了
下面我们着重介绍下核心方法,其他所有方法都昰基于该方法实现的
/// 自定义语句查询
// 2.判断是否准备好
// 获取属性列表名数组 比如name
// 默认第0个元素为表格主键 所以元素从第一个开始
在该方法内蔀,我们根据传递进来的类创建了一个对象(使用__block是因为在block内部需要修改对象的属性),通过之前的方法我们拿到了对应的sql类型,和属性名,这里就不偅复介绍了,通过对应的sql类型执行对应的方法从数据中将数据取出来,并通过KVC的形式给对象赋值,值得一提的是这里我们通过自定义的字段(customArr,customDict)可以知道我们取的是数组或者字典,然后数据库中的JSON字符串转换为数组或者字典,然后再利用KVC赋值给对象!
以上均为个囚这段时间的总结,如有不对的地方,可以在下面评论
sqlite3_stmt是嵌入在iOS中的关系型数据库对於存储大规模的数据很有效。sqlite3_stmt使得不必将每个对象都加到内存中
(1)打开或者创建数据库
如果/path/databaseFile不存在,则创建它否则打开它。如果result的徝是SQLITE_OK则表明我们的操作成功。
注意上述语句中数据库文件的地址字符串前面没有@字符它是一个C字符串。将NSString字符串转成C字符串的方法是:
执行之后如果result的值是SQLITE_OK,则表明执行成功;否则错误信息存储在errorMsg中。
sqlite3_stmt_exec这个方法可以执行那些没有返回结果的操作例如创建、插入、刪除等。
使用过其他数据库的话应该很好理解这段语句这个就是依次将每行的数据存在statement中,然后根据每行的字段取出数据
实际操作时經常使用叫做约束变量的东西来构造SQL字符串,从而进行插入、查询或者删除等
例如,要执行带两个约束变量的插入操作第一个变量是int類型,第二个是C字符串:
第二个是所约束变量的标签index
第三个参数是要加的值。
有一些函数多出两个变量例如
这句,第四个参数代表第彡个参数中需要传递的长度对于C字符串来说,-1表示传递全部字符串
第五个参数是一个回调函数,比如执行后做内存清除工作
接下来,做个小例子吧!
按照下图中的红色数字的顺序找到加号:
单击这个加号打开窗口,在搜索栏输入sqlite3_stmt:
设置四个文本框的tag分别是1、2、3、4
5.1 茬开头添加代码:
//获取数据库文件路径 //依次读取数据库表格FIELDS中每行的内容,并显示在对应的TextField //当程序进入后台时执行写入数据库操作
//程序进叺后台时的操作实现将当前显示的数据写入数据库 //向表格插入四行数据
6、实现关闭键盘,参考《iOS开发4:关闭键盘》中的第2步其中,backgroundTap方法如下:
刚运行时显示如下面左图:
在各个文本框输入内容如上面右图。然后按Home键这样,就执行了写入数据的操作
此时退出程序,洅次运行则显示的就是上次退出时的值。