Core Data with Mantle
Mantle makes
it easy to write a simple model layer for your Cocoa or Cocoa Touch application. Mantle
can still be a convenient translation layer between the API and your managed model objects.
本文使用mantle作data model。并使用其对coredata的interface创建数据持久化的过程。
操作过程非常easy。就是数据的转换:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbmd3ZWlwZW5nMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
1.Manle data model
Mantle中用于持久化的方法:
// A MTLModel object that supports being serialized to and from Core Data as an
// NSManagedObject.
- @protocol MTLManagedObjectSerializing
- @required
// The name of the Core Data entity that the receiver serializes to and
// deserializes from.
- + (NSString *)managedObjectEntityName;
// Specifies how to map property keys to different keys on the receiver's
// +managedObjectEntity.
- + (NSDictionary *)managedObjectKeysByPropertyKey;
.h 文件
- #import <Foundation/Foundation.h>
- @interface BannerWrapper : MTLModel <MTLJSONSerializing,MTLManagedObjectSerializing>
- @property (nonatomic, readonly) bool result;
- @property (copy, nonatomic, readonly) NSNumber *resultId;
- @property (copy, nonatomic, readonly) NSString *resultMsg;
- @property (copy, nonatomic) NSArray *bannerList;
- +(NSSortDescriptor *)sortDescriptor;
- @end
- @interface Banner : MTLModel <MTLJSONSerializing, MTLManagedObjectSerializing>
- @property (copy, nonatomic, readonly) NSNumber *bannerId;
- @property (copy, nonatomic, readonly) NSString *picUrl;
- @property (copy, nonatomic, readonly) NSString *toDetailUrl;
- @property (copy, nonatomic, readonly) NSNumber *width;
- @property (copy, nonatomic, readonly) NSNumber *height;
- @end
.m文件
- #import "Banner.h"
- @implementation BannerWrapper
- #pragma mark - JSON serialization
- + (NSDictionary *)JSONKeyPathsByPropertyKey {
- return @{
- @"result" : @"result",
- @"resultId" : @"resultId",
- @"resultMsg" : @"resultMSG",
- @"bannerList" : @"banner"
- };
- }
- + (NSValueTransformer *)bannerListJSONTransformer
- {
- return [NSValueTransformer mtl_JSONArrayTransformerWithModelClass:[Banner class]];
- }
- #pragma mark - Managed object serialization
- + (NSString *)managedObjectEntityName {
- return @"BannerWrapper";
- }
- + (NSDictionary *)managedObjectKeysByPropertyKey {
- return nil;
- }
- +(NSDictionary *)relationshipModelClassesByPropertyKey{
- return @{
- @"bannerList" : [Banner class],
- };
- }
- //在从coredata中取数据时的数据排序方式
- +(NSSortDescriptor *)sortDescriptor{
- return [[NSSortDescriptor alloc] initWithKey:@"resultId" ascending:YES];
- }
- @end
- @implementation Banner
- #pragma mark - JSON serialization
- + (NSDictionary *)JSONKeyPathsByPropertyKey {
- return @{
- @"bannerId" : @"id",
- @"picUrl" : @"picUrl",
- @"toDetailUrl" : @"toDetailUrl",
- @"width":@"width",
- @"height":@"height"
- };
- }
- #pragma mark - Managed object serialization
- + (NSString *)managedObjectEntityName {
- return @"Banner";
- }
- + (NSDictionary *)managedObjectKeysByPropertyKey {
- return nil;
- }
- @end
2.coredata 持久化类
Coredata主要元素简要介绍
网上有非常多图,但,还是认为一本书上的这个图最好:
- 1。 Managed Object Model
Managed Object Model 是描写叙述应用程序的数据模型,这个模型包括实体(Entity)。特性(Property),读取请求(Fetch Request)等。(下文都使用英文术语。)
2,Managed Object Context
Managed Object Context 參与对数据对象进行各种操作的全过程,并监測数据对象的变化,以提供对 undo/redo 的支持及更新绑定到数据的 UI。3,Persistent Store Coordinator
Persistent Store Coordinator 相当于数据文件管理器,处理底层的对数据文件的读取与写入。一般我们无需与它打交道。
4,Managed Object
Managed Object 数据对象,与 Managed Object Context 相关联。
5,Controller
图中绿色的 Array Controller, Object Controller, Tree Controller 这些控制器。一般都是通过 control+drag 将 Managed Object Context 绑定到它们。这样我们就能够在 nib 中可视化地操作数据。
.h文件
- #import <Foundation/Foundation.h>
- @interface Persistence : NSObject
- //数据模型对象
- @property(strong,nonatomic) NSManagedObjectModel *managedObjectModel;
- //上下文对象
- @property(strong,nonatomic) NSManagedObjectContext *managedObjectContext;
- //持久性存储区
- @property(strong,nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- //确定sqlite文件存储路径
- -(NSURL *)storeURL;
- //初始化Core Data使用的数据库
- -(NSPersistentStoreCoordinator *)persistentStoreCoordinator;
- //managedObjectModel的初始化赋值函数
- -(NSManagedObjectModel *)managedObjectModel;
- //managedObjectContext的初始化赋值函数
- -(NSManagedObjectContext *)managedObjectContext;
- //保存MTLModel对象至coredata
- -(BOOL)saveMTLModel:(MTLModel<MTLManagedObjectSerializing> *)mtlModel
- error:(NSError * __autoreleasing *)error;
- //从coredata中提取出MTLModel
- -(MTLModel *)getMTLmodel:(MTLModel<MTLManagedObjectSerializing> *)mtlModel
- error:(NSError *__autoreleasing *)error;
- //+ (NSFetchRequest *)fetchRequest;
- @end
.m文件
- #import "Persistence.h"
- @implementation Persistence
- @synthesize managedObjectContext;
- @synthesize managedObjectModel;
- @synthesize persistentStoreCoordinator;
- //确定sqlite文件存储路径
- -(NSURL *)storeURL{
- //得到数据库的路径
- // NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
- // //CoreData是建立在SQLite之上的。数据库名称需与Xcdatamodel文件同名
- // NSURL *storeUrl = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"CoreData.sqlite"]];
- NSArray *documnetDir=NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
- NSString *docDir=[documnetDir objectAtIndex:0];
- NSString *path=[docDir stringByAppendingPathComponent:@"CoreData.sqlite"];
- NSURL *storeURL=[NSURL fileURLWithPath:path];
- return storeURL;
- }
- //初始化Core Data使用的数据库
- -(NSManagedObjectModel *)managedObjectModel
- {
- if (managedObjectModel != nil) {
- return managedObjectModel;
- }
- return [NSManagedObjectModel mergedModelFromBundles:nil];
- }
- //managedObjectModel的初始化赋值函数
- -(NSPersistentStoreCoordinator *)persistentStoreCoordinator
- {
- if (persistentStoreCoordinator != nil) {
- return persistentStoreCoordinator;
- }
- NSError *error = nil;
- persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
- initWithManagedObjectModel:self.managedObjectModel];
- if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
- configuration:nil
- URL:[self storeURL]
- options:nil
- error:&error]) {
- NSLog(@"Error: %@,%@",error,[error userInfo]);
- [NSException raise:@"open failed" format:@"Reason:%@",[error localizedDescription]];
- }
- return persistentStoreCoordinator;
- }
- //managedObjectContext的初始化赋值函数
- -(NSManagedObjectContext *)managedObjectContext
- {
- if (managedObjectContext != nil) {
- return managedObjectContext;
- }
- NSPersistentStoreCoordinator *coordinator =self.persistentStoreCoordinator;
- if (coordinator != nil) {
- managedObjectContext = [[NSManagedObjectContext alloc]init];
- [managedObjectContext setPersistentStoreCoordinator:coordinator];
- }
- return managedObjectContext;
- }
- //保存MTLModel对象至coredata
- -(BOOL)saveMTLModel:(MTLModel<MTLManagedObjectSerializing> *)mtlModel
- error:(NSError *__autoreleasing *)error{
- //-----Need Add Remove the Entity First START---------
- NSManagedObject *exsitManagedObject=[self getManagedObject:mtlModel
- error:error];
- if (exsitManagedObject!=nil) {
- [self.managedObjectContext deleteObject:exsitManagedObject];
- [self.managedObjectContext save:error];
- };
- //-----Need Add Remove the Entity First END-----------
- NSManagedObject *managedObject = [MTLManagedObjectAdapter
- managedObjectFromModel:mtlModel
- insertingIntoContext:self.managedObjectContext
- error:error];
- if (managedObject==nil) {
- NSLog(@"[NSManagedObject] Error:%@",*error);
- return NO;
- }
- if (![self.managedObjectContext save:error]) {
- NSLog(@"[self.managedObjectContext] Error:%@",*error);
- return NO;
- };
- return YES;
- };
- //从coredata中提取出MTLModel
- -(MTLModel *)getMTLmodel:(MTLModel<MTLManagedObjectSerializing> *)mtlModel
- error:(NSError *__autoreleasing *)error{
- NSManagedObject *managedObject=[self getManagedObject:mtlModel error:error];
- MTLModel *mrlMotel=[[MTLModel alloc] init];
- mrlMotel = [MTLManagedObjectAdapter modelOfClass:[mtlModel class]
- fromManagedObject:managedObject error:error];
- if (error) {
- NSLog(@"[mrlMotel] Error:%@",*error);
- }
- return mrlMotel;
- };
- //从coredata中获取已存的ManagedObject
- -(NSManagedObject *)getManagedObject:(MTLModel<MTLManagedObjectSerializing> *)mtlModel
- error:(NSError *__autoreleasing *)error{
- NSString *entityName=[[mtlModel class] managedObjectEntityName];
- //获取entity中对象数量
- NSFetchRequest *requestCount=[NSFetchRequest fetchRequestWithEntityName:entityName];
- NSUInteger count=[self.managedObjectContext countForFetchRequest:requestCount
- error:error];
- NSLog(@"count result:%d",count);
- NSLog(@"sortDescriptor result:%@",[[mtlModel class] sortDescriptor]);
- //获取entity中第一个对象.这个对象必须存在且唯一。
- if (count==1) {
- NSFetchRequest *request=[[NSFetchRequest alloc] init];
- [request setEntity:[NSEntityDescription entityForName:entityName
- inManagedObjectContext:self.managedObjectContext]];
- NSSortDescriptor *sort=[[mtlModel class] sortDescriptor];
- NSArray *sortDes=[[NSArray alloc] initWithObjects:sort, nil nil];
- [request setSortDescriptors:sortDes];
- NSArray *getObject=[self.managedObjectContext
- executeFetchRequest:request
- error:error];
- return [getObject objectAtIndex:0];
- }
- return nil;
- }
- //从文件系统中删除sqlite文件
- -(bool)deleteAllEntities{
- bool status=NO;
- NSError *error;
- @try{
- [[NSFileManager defaultManager] removeItemAtPath:[self storeURL].path
- error:&error];
- status=YES;
- }
- @catch (NSException *exception) {
- status=NO;
- }
- @finally {
- return status;
- }
- }
- @end
3.后台运行程序
- - (void)loadBannerList:(void (^)(NSArray *bannerList, NSError *error))block {
- NSParameterAssert(block);
- [self POST:@"webresources/homePage"
- parameters:nil
- resultClass:BannerWrapper.class
- resultKeyPath:nil
- completion:^(AFHTTPRequestOperation *operation, id responseObject, NSError *error) {
- //-----------------------Persistence DEMO---------------------
- //If network error, get data from CoreData, else save data into CoreData
- if (!error) {
- NSError *err;
- Persistence *persistence=[[Persistence alloc] init];
- BOOL save=[persistence saveMTLModel:responseObject error:&err];
- if (save==NO) {
- NSLog(@"Save ERROR!");
- }
- }else{
- NSError *err;
- Persistence *persistence=[[Persistence alloc] init];
- BannerWrapper *resObject=[[BannerWrapper alloc] init];
- BannerWrapper *object=[[BannerWrapper alloc] init];
- object=[persistence getMTLmodel:resObject error:&err];
- responseObject=object;
- //这个地方异常的奇怪,从coredata中应该返回打Array类型变成了set类型,所以这里临时作了一个转换。
- if ([object.bannerList isKindOfClass:[NSSet class]]) {
- NSArray *objectArray = [(NSSet *)object.bannerList allObjects];
- ((BannerWrapper *)responseObject).bannerList=objectArray;
- }
- }
- //-----------------------------------------------------------
- BannerWrapper *wrapper = responseObject;
- block(wrapper.bannerList, error);
- }];
- }
Core Data with Mantle的更多相关文章
- 在 Core Data 中存取 transformable 类型的数据
本文转载至 http://imenjoe.com/2015/04/10/CoreData-transformable-20150410/ 在开发过程中有一个需要在 Core Data 中存取 NSDi ...
- iOS之Core Data及其线程安全
一.简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对 ...
- Core Data的一些常见用法
一.简介 Core Data是一个纯粹的面向对象框架,其本质就是一个ORM(对象关系映射:Object Relational Mapping),能以面向对象的方式操作SQLite数据库.在实际开发中绝 ...
- Core Data 使用映射模型
Core Data 使用映射模型 如果新版本的模型存在较复杂的更改,可以创建一个映射模型,通过该模型指定源模型如何映射到目标模型. 创建映射模型,新建File, Core Data 选择Mappin ...
- SELF, self in CORE DATA
Predicate SELF Represents the object being evaluated. CORE DATA Retrieving Specific Objects If your ...
- Core Data浅谈初级入门
Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数 ...
- Core Data
• Core Data 是 iOS SDK 里的一个很强大的框架,允许程序员 以面向对象 的方式储存和管理数据 .使用 Core Data 框架,程序员可以很轻松有效 地通过面向对象的接口 ...
- iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】
在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...
- 我为什么用 SQLite 和 FMDB 而不用 Core Data
凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和 ...
随机推荐
- 一个汉字转拼音的php类
代码来自网上,可用 <?php function Pinyin($_String, $_Code='gb2312') { $_DataKey = "a|ai|an|ang|ao|ba| ...
- Java的Integer和int有什么区别
Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper cla ...
- 《Lua程序设计》第4章 语句 学习笔记
Lua中的常规语句包括:赋值.控制结构和过程调用.Lua还支持一些不太常见的语句,如:多重赋值(multiple assignment) 和 局部变量声明.4.1 赋值Lua允许“多重赋值”,也就是一 ...
- (原创)使用mceusb设备,将lirc移植到android笔记
首先说一下大环境和总体步骤: 下载lirc 0.8.7源码,使用ubuntu的setup.sh,配置为mceusb的驱动,同时Compile tools for X-Windows选项去掉,生成con ...
- (原)强类型dataset(类型化dataset)中动态修改查询条件(不确定参数查询)
原创博客,转载请注明:http://www.cnblogs.com/albert1017/p/3361932.html 查询时有多个参数,参数个数由客户输入决定,不能确定有多少个参数,按一般的方法每种 ...
- 由于更换硬盘没有删除系统自启动读取挂载硬盘导致系统报错:fsck.ext4 unable to resolve 'UUID=a4a7a0f7-b54f-4774-9fb1'
由于更换硬盘没有删除系统自启动读取挂载硬盘导致系统报错:fsck.ext4 unable to resolve 'UUID=a4a7a0f7-b54f-4774-9fb1' 此时进入系统已root模式 ...
- 【node.js】Error: CERT_UNTRUSTED
背景 : 在linux centos7 上 进行npm 命令是报错: Error: CERT_UNTRUSTED 解决办法: 关掉HTTPS就好了 npm config set strict-ssl ...
- 二、K3 Cloud 开发插件《K3 Cloud 常用数据表整理》
一.数据库查询常用表 --查询数据表select * from ( ),t1.FKERNELXML.query('//TableName')) as 'Item',t1.FKERNELXML,t2.F ...
- mFC 橡皮线
一般都用GDI实现: void CXiangpijinView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message ...
- 其它终端设备连接gmail账户提示密码错误解决方法
换新手机配置Google Account继续使用Gmail服务,输入用户名.密码进入状态同步一段时间后再次提示输入用户名.密码并显示账号信息不正确.网上有人提到"修改用户密码"再进 ...
