文档章节

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

juwenz
 juwenz
发布于 2015/02/25 09:09
字数 1203
阅读 41
收藏 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与JS交互之UIWebView-JavaScriptCore框架

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

QiShare
08/30
0
0
iOS与JS交互之UIWebView-JSExport协议

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

QiShare
08/31
0
0
移动深度学习 Mobile-deep-learning(MDL)

Free and open source mobile deep learning framework, deploying by Baidu. This research aims at simply deploying CNN on mobile devices, with low complexity and high speed. It sup......

磐石001
2017/09/25
0
0
谷歌Flutter跨平台应用开发SDK迎来首个发行预览版本

谷歌Flutter跨平台应用开发SDK迎来首个发行预览版本 2018-06-22 12:26编辑: 枣泥布丁分类:程序人生来源:程序师 跨平台Google Flutter预览版本 招聘信息: 图像处理及模式识别工程师 C/C+...

枣泥布丁
06/22
0
0
HTML 移动端框架 - Framework7

Framework7 或者叫 F7 是全功能的绑定 iOS 7 应用的 HTML 框架。Framework7 是免费开源的 HTML 移动端框架,用来开发混合移动端应用或者 iOS 7 的 Web 应用,并且带有 iOS 7 的原生外观和感觉...

匿名
2014/07/24
0
5

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
今天
2
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
5
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
4
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
5
0
中秋快乐!!!

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部