文档章节

IOS 手机端数据持久框架DPDB 详解

juwenz
 juwenz
发布于 2015/02/25 09:09
字数 1203
阅读 42
收藏 0

#项目简介 框架主要解决苹果开发过程中,数据本地持久化问题。开发初期,选用了sqlite,就一直折腾至今,不爱用coredata,或许它更加好用,不过人总有那么点执着,或者说固执,不是吗?废话不多说,开始介绍。 #方法总览

- save:                    //保存或更新对象
- deleteMe;                //删除自身对象
- pk;                      //得到对象主键,默认为-1
+ queryByPk:               //根据主键查询对象
+ saveObjects:;            //批量保存对象
+ deleteAll;               //级连删除对象
+ deleteByPks:;            //批量删除对象,参数是主键数组
+ allObjects;              //查询所有对象
#待添加
+ 条件查询
+ 分页查询
+ 保存文件(包括图片,视频等)

#方法使用说明 此部分不一一讲解每个方法,根据实际项目中对象持久经常遇到的两种情况分别说明,无关联对象和有关联对象。 ##无关联对象 直接上代码讲解简单明了

<!-- NoRelationshipObject.h -->
#import "DPDBObject.h"
@interface NoRelationshipObject : DPDBObject
@property (nonatomic,strong)        NSString *desc;
@property (nonatomic,assign)        NSInteger    aNumber;
@property (nonatomic,assign)        int          aInt;
@property (nonatomic,assign)        float        aFloat;
@property (nonatomic,assign)        double       aDouble;
@end

上面声明了一个无关联对象,如何保存呢,请看下面

<!-- lang: cpp -->
NoRelationshipObject *nrObject = [[NoRelationshipObject alloc] init];
nrObject.desc = @"这是在测试无关联对象";
noObject.aInt = 2012;
// 此处略去其它属性的赋值
//保存到数据库
[noObject save];

如何验证数据库中是否保存成功,打开数据库,查看数据库中是否存在此记录。

##一对一关联对象 新建一个类OneToOneObject

<!-- OneToOneObject.h -->
#import "DPDBObject.h"
@interface OneToOneObject : DPDBObject
@property (nonatomic,strong)        NSString *desc;
@property (nonatomic,strong)        NoRelationshipObject *nrObject;
@end

按照上面方法,创建一个NoRelationshipObject对象nrObject,再实例化一个OneToOneObject对象otoObject

OneToOneObject *otoObject = [[OneToOneObject alloc] init];
otoObject.desc = @"这是在测试一对一关联对象";
otoObject.nrObject = nrObject;
[otoObject save];

一切如你所料,没有任何意外,如何验证保存成功呢,当然可以在数据库中查找对应的记录是否产生,也可以通过程序检测

//接上
NSInteger pk = [otoObject pk];
OneToOneObject *object = [OneToOneObject queryByPk:pk];
if(object){
    //可以打断点验证,也可以写代码验证
}else{
    NSLog(@"验证失败,没有保存成功");
}

没有任何悬念的结束了,接下来将一对多关系的保存; ##一对多关联对象的保存 前两种情况都比较简单,第三种情况就比较复杂了,想了很多方法,包括动态判断类型,配置文件管理,命名判别等等,最后由于种种问题给pass掉了(如果有兴趣可以留言继续探讨这个问题) 还是直接上代码,新建一个类OneToManyObject

<!-- OneToManyObject.h -->
#import "DPDBObject.h"
@interface OneToManyObject : DPDBObject
@property (nonatomic,strong)        NSString *desc;
@property (nonatomic,strong)        NSArray  *nrArrs;
@end

类里面有个集合类型属性,由于无法像JAVA一样显式指定里面的类型,所以在第一次查询的时候不知道如何“包装”得到的数据,所以需要在OneToManyObject.m方法里面加上一个类方法+ (NSDictionary *)collectionTypeInfo;

#import "OneToManyObject.h"
@implementation OneToManyObject
+ (NSDictionary *)collectionTypeInfo
{
    return
    @{
         @"nrArrs":NSStringFromClass([NoRelationshipObject class])
    };
}

相信看到代码已经明白是什么意思了,指定集合类型的元素类型,这下我就明白了,原来里面装的是 NoRelationshipObject对象,那我就按照NoRelationshipObject方法包装。 使用代码如下

OneToManyObject *otmObject = [[OneToManyObject alloc] init];
NSMutableArray *objects = [NSMutableArray array];
for (NSInteger i = 0 ; i < 10 ; i++){
    NoRelationshipObject *nrObject = [[NoRelationshipObject alloc] init];
    nrObject.desc = [NSString stringWithFormat:@"这是在测试无关联对象-%ld",(long)i];
    [objects addObject:nrObject];
}
otmObject.nrArrs = objects;
[otmObject save];

全部搞定,接下来就是验证了,可以参考上面的验证方式进行验证!

#适用的情况 本框架善不完整,有几方面的功能没有实现,

  • 事务支持,整个框架没有涉及到事务处理,如果有这方面业务需要的,要让你们失望了
  • 属性类型修改,对于同一个属性名,有修改属性类型的,暂时没有实现,这个功能后期可能会加入进去 如果对上面两个需求不是很强烈的,可以尝试下哟,有问题欢迎一起探讨!!

#参考&致谢 这个是很重要滴,喝水不忘挖井人,框架的灵感来自sqliteobjectpersistence,从一行一行读里面代码学到了很多东西,它里面的某些功能甚至现在本猿也没有实现,不过对里面频繁计算部分做了优化,用了缓存换取CPU计算,带来的当然是时间上的优势,再次感谢sqliteobjectpersistence作者。

© 著作权归作者所有

共有 人打赏支持
juwenz
粉丝 2
博文 17
码字总数 8203
作品 0
成都
程序员
私信 提问
如果只有一个月的时间学 iOS 开发,我们该做些什么?

一年前,我还是一个 Android 开发者。那时候我没有任何 iOS 编程相关的知识,我甚至没用过任何苹果的产品。然而,这已成为过去,现在我已经能同时开发 iOS 和 Android 应用了。 现在,我想给...

oschina
2017/03/09
3.3K
13
iOS与JS交互之UIWebView-JSExport协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JSExport」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前端(不...

QiShare
2018/08/31
0
0
iOS与JS交互之UIWebView-JavaScriptCore框架

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JavaScriptCore」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前...

QiShare
2018/08/30
0
0
迈绝伦团队工作汇总(22号未发内容补充)

项目负责人:余志恒 up_java后台:无 mz_java后台:完成抢客首页定位功能 bwk后台:无 项目负责人:季景胜 up_Android:无 upzg_Android:无 mzqk_Android:完成抢客分享页面与提示语的修改 ...

风化的骆驼
2016/12/23
1
0
最简单的基于FFmpeg的移动端例子附件:Android 自带播放器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leixiaohua1020/article/details/47056733 ===================================================== 最简单的...

雷霄骅
2015/07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
今天
1
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
5
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部