咱们从0开始封了一个面向OC模型的数据库就要结束了,开发工做其实在上一篇就作完了,以后作了一些小的优化以及代码的调整来发布这篇文章,先看一下咱们最终形态。git
咱们支持的类型有:github
全部的基本数据类型(int,float),NSNumber,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,
UIImage,NSURL,UIColor,NSSet,NSRange,NSAttributedString,NSData,自定义模型,以及数组、字典、模型相互嵌套
复制代码
类名 | 做用 |
---|---|
CWModelProtocol.h | 须要遵照以及实现的协议方法(用户关注) |
CWSqliteModelTool.h、CWSqliteModelTool.m | 本库操做数据库的全部API(用户关注) |
CWDatabase.h、CWDatabase.m | 直接调用sqlite底层API的类 |
CWModelTool.h、CWModelTool.m | 处理模型的工具类 |
CWSqliteTableTool.h、CWSqliteTableTool. | 处理数据库表的工具类 |
咱们但愿保存几所学校的资料到数据库。sql
以上的层级关系有模型嵌套数组嵌套模型的场景、模型嵌套模型再嵌套数据再嵌套模型的场景也就模型直接嵌套模型的场景。数据库
而后咱们使用工厂方法来快速构造各个模型,用来搭建整个学校数组
学校的结构设定好了以后~咱们用代码构造一所所这样的梦想学院。。而后咱们要使用咱们的数据库将学校的资料保存起来。bash
+ (NSString *)primaryKey {
// 返回schoolId为主键
return @"schoolId";
}
复制代码
// 使用工厂方法建立的shool模型
CWSchool *school = [self cwSchoolWithID:9999 name:@"梦想学院"];
// 调用保存或者更新方法,uid为userId,对应数据库的名字,targetId为目标ID,与数据库表名相关,能够传nil。
BOOL result = [CWSqliteModelTool insertOrUpdateModel:school uid:nil targetId:nil];
复制代码
为何要设置两个多余的参数uid与TargetId?为了迎合下面一些场景,若是你不关注,传nil便可架构
关于数据库升级以及数据库迁移,假设我存在数据库的数据为聊天记录Message,里面有10个成员变量,有一天,业务的提高,我要在Message里面多加一个成员变量,如新增一个成员变量用来标记是不是撤回的消息,这个时候因为数据库的表结构固定死了没这个字段,插入数据确定是失败的,为了解决这个问题,咱们将要进行数据库升级,而且要将以前的数据都保留下来,这个要怎么作呢?这里压根不须要你思考这个问题,我做为一个负责任的男人,我很负责任的告诉你,假如你的Message模型新增长了1个2个10个成员变量,你只管加,加了以后只管调用上面的方法存,数据的升级以及迁移咱们默认会帮你完成!!!框架
// result内的元素为CWSchool的模型
NSArray *result = [CWSqliteModelTool queryAllModels:[CWSchool class] uid:nil targetId:nil];
复制代码
查询方法返回值是一个数组,这个数组里面的数据所有为CWSchool的模型,由于咱们承诺过,保存的时候是模型A,查询出来的必定也是模型A。工具
CWSchool *school = [self cwSchoolWithID:9999 name:@"梦想学院"];
// 删除school数据
BOOL result = [CWSqliteModelTool deleteModel:school uid:nil targetId:nil];
复制代码
这个方法,会根据传进来的模型的主键值去找到数据表里面的数据删除。post
咱们的功能基本都在这了,除了还有一些条件查询与删除没写在这里。有人会问,数据库不是增删查改4个吗?怎么你只有3个,咱们也实现了改的操做,只是咱们把这个操做和增合并成了一个方法,也就是这里的第一个方法,咱们会根据主键来判断数据库内是否存在对应的数据,若是存在,咱们则进行更新操做,不存在则插入数据。