iOS 数据持久化之CoreData(二)堆栈建立和基本操作Demo
来源:互联网 发布:北京的大学排名 知乎 编辑:程序博客网 时间:2024/06/06 18:07
原创Blog,转载请注明出处
blog.csdn.net/hello_hwc
欢迎关注我的iOS SDK详解专栏
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
前言:本文会通过一个完整的工程创建,讲解
- CoreData的堆栈创建
- 四种基本的操作(查询,创建,删除,更新)
- 简单的MVC设计
- 如何使用Block传递Action,缩减代码量
- 再CoreData使用类别扩展NSManagedObject方法
Demo下载
http://download.csdn.net/detail/hello_hwc/8692083
注意,这个Demo侧重讲解如何建立CoreData堆栈,以及常见的四种操作,为后续文章的讲解做铺垫的,所以非常简单,简单到体现不到CoreData的优点,如果你哪怕写过一个使用了CoreData的工程,那就这篇就可以直接不看了。
Demo效果
四种基本操作
点击Query All
Log输出
2015-05-13 10:26:13.534 QuiteSimpeCoreDataDemo[3029:62136] ( "name:Lucy age:21", "name:Tom age:20", "name:jack age:21")
然后,添加一个新的Person,点击Create
输出
2015-05-13 10:27:03.764 QuiteSimpeCoreDataDemo[3029:62136] Create Successfully.Id is 0xd000000000100000 <x-coredata://ACB1C333-E7B3-4D6A-BF58-7061952D95AD/Person/p4>
然后更新
输出
2015-05-13 10:28:21.109 QuiteSimpeCoreDataDemo[3029:62136] Update Successfully
在查询全部,看到年龄更新成功
2015-05-13 10:30:06.557 QuiteSimpeCoreDataDemo[3029:62136] ( "name:Lily age:24", "name:Lucy age:21", "name:Tom age:20", "name:jack age:21")
删除
输出
2015-05-13 10:31:27.312 QuiteSimpeCoreDataDemo[3029:62136] Delete successfully
再查询,发现删除成功
2015-05-13 10:31:42.711 QuiteSimpeCoreDataDemo[3029:62136] ( "name:Lucy age:21", "name:Tom age:20", "name:jack age:21")
Demo的建立过程
- 新建一个工程,注意选中使用CoreData
- 查看AppDelegate.m,会发现很多和CoreData创建堆栈相关的代码,为了代码的解耦合,把这些代码以AppDelegate.m中的代码拷贝到一个新建类(Store)中,这个类点作用就是创建堆栈,提供NSManagedContext
Store.h
#import <Foundation/Foundation.h>#import <CoreData/CoreData.h>@interface Store : NSObject@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;- (void)saveContext;- (NSURL *)applicationDocumentsDirectory;@end
再看看Store.m各个部分的内容
//获取DocumentDirectory- (NSURL *)applicationDocumentsDirectory { return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];}
获取对象图模型,这里的对象图名字就是这个文件的名字
- (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil) { return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"QuiteSimpeCoreDataDemo" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel;}
创建持久化存储协调器
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"QuiteSimpeCoreDataDemo.sqlite"]; NSError *error = nil; NSString *failureReason = @"There was an error creating or loading the application's saved data."; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { NSMutableDictionary *dict = [NSMutableDictionary dictionary]; dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data"; dict[NSLocalizedFailureReasonErrorKey] = failureReason; dict[NSUnderlyingErrorKey] = error; error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict]; NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort();//这里为了方便调试,正常的App不要这样写 } return _persistentStoreCoordinator;}
创建Managed Context
- (NSManagedObjectContext *)managedObjectContext { // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (!coordinator) { return nil; } _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; return _managedObjectContext;}
保存到磁盘
- (void)saveContext { NSManagedObjectContext *managedObjectContext = self.managedObjectContext; if (managedObjectContext != nil) { NSError *error = nil; if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } }}
- 点击QuiteSimpleCoreDataDemo.xcdatamodeld,创建一个Entity,命名为Person,添加两个属性,name和age,如图
Editor- CreateNSManaged Subclass - 一致勾选-创建声称两个文件,Person.h,Person.m
创建Person的类别Function+Person,在这里为NSManagedObject添加方法,不要在类中直接添加,因为下次在自动生成时候会把这之前的覆盖掉。
Function+Person.h文件
#import "Person.h"@interface Person (Functions)+(NSString *)entityName;+(Person *)insertNewObjectInManagedObjectContext:(NSManagedObjectContext *) context;@end
Function+Person.m文件
#import "Person+Functions.h"@implementation Person (Functions)+(NSString *)entityName{ return @"Person";}+(Person *)insertNewObjectInManagedObjectContext:(NSManagedObjectContext *) context{ return [NSEntityDescription insertNewObjectForEntityForName:[self entityName] inManagedObjectContext:context];}//重写Description,方便Log-(NSString *)description{ return [NSString stringWithFormat:@"name:%@ age:%ld",self.name,(long)self.age.integerValue];}@end
然后,回到viewController进行相关的处理
使用AlertController作为输入,创建一个公共方法,这里的CoreDataAction是我定义的一个Block,传入如何处理数据的动作。
typedef void(^CoreDataAction)(NSString * name,NSString * age);
-(void)AlertTextFieldWithTitle:(NSString *)actionTitle Action:(CoreDataAction) actionBlock { UIAlertController * alert = [UIAlertController alertControllerWithTitle:actionTitle message:nil preferredStyle:UIAlertControllerStyleAlert]; [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) { textField.placeholder = @"Name"; }]; [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) { textField.placeholder = @"age"; }]; [alert addAction:[UIAlertAction actionWithTitle:actionTitle style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { NSArray * textfields = alert.textFields; UITextField * nameTextfields = textfields[0]; UITextField * ageTextFields = textfields[1]; actionBlock(nameTextfields.text,ageTextFields.text); }]]; [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; [self presentViewController:alert animated:YES completion:nil];}
查询当前Name的Person是否存在(本工程Person的name不允许重复),存在则返回,不存在则返回nil
-(Person *)personExistWithName:(NSString *)name{ NSFetchRequest * fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[Person entityName]]; //This is an array fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name = %@",name]; NSError *error = nil; NSArray *fetchedObjects = [self.store.managedObjectContext executeFetchRequest:fetchRequest error:&error]; if (fetchedObjects == nil) { return nil; }else{ return [fetchedObjects lastObject]; }}
对应的四个Button的target-action
查询
- (IBAction)queryAll:(id)sender { NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:[Person entityName] inManagedObjectContext:self.store.managedObjectContext]; [fetchRequest setEntity:entity]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]]; NSError *error = nil; NSArray *fetchedObjects = [self.store.managedObjectContext executeFetchRequest:fetchRequest error:&error]; if (fetchedObjects == nil) { NSLog(@"It is empty"); }else{ NSLog(@"%@",fetchedObjects.description); }}
更新
- (IBAction)update:(id)sender { [self AlertTextFieldWithTitle:@"Update" Action:^(NSString *name, NSString *age) { Person * person = [self personExistWithName:name]; if (person != nil) { person.age = @(age.integerValue); [self.store saveContext]; NSLog(@"Update Successfully"); }else{ NSLog(@"Person does not exist,can not update"); } }];}
创建
- (IBAction)Create:(id)sender { [self AlertTextFieldWithTitle:@"Create" Action:^(NSString *name, NSString *age) { if ([self personExistWithName:name] == nil) { Person * person = [Person insertNewObjectInManagedObjectContext:self.store.managedObjectContext]; person.name = name; person.age = @(age.integerValue); [self.store saveContext]; NSLog(@"Create Successfully.Id is %@",person.objectID.description); }else{ NSLog(@"This peson exist before,can not create"); } }];}
删除
- (IBAction)Delete:(id)sender { [self AlertTextFieldWithTitle:@"Delete" Action:^(NSString *name, NSString *age) { Person * person = [self personExistWithName:name]; if (person != nil) { [self.store.managedObjectContext deleteObject:person]; NSLog(@"Delete successfully"); }else{ NSLog(@"This does not exist before,can not delete"); } }];}
- iOS 数据持久化之CoreData(二)堆栈建立和基本操作Demo
- iOS 数据持久化之CoreData(三)NSFetchedResultsController +Demo
- iOS 数据持久化之CoreData(一)堆栈与基本概念
- iOS开发数据持久化之-CoreData
- ios 数据持久化之magical record(基于coredata)
- iOS 数据持久化-CoreData
- iOS 数据持久化 CoreData
- IOS学习——数据持久化(二):初识CoreData
- iOS 通过CoreData实现数据持久化
- iOS ---- 高级数据持久化CoreData
- iOS 通过CoreData实现数据持久化
- iOS 通过CoreData实现数据持久化
- iOS开发 - CoreData框架 数据持久化
- iOS开发 - CoreData框架 数据持久化
- 《精通iOS开发·第六版》数据持久化基础知识之CoreData持久化
- iOS持久化之CoreData(待总结)
- 数据持久化(五)之CoreData
- 数据持久化(五)之CoreData
- 基于gsoap的onvif discovery服务端程序主要流程
- 程序员应该学习的签名破解
- Android 项目创建
- plantuml for eclipse 安装
- 将Word转换成PDF文档有什么技巧
- iOS 数据持久化之CoreData(二)堆栈建立和基本操作Demo
- M3U8文件简介
- hdu3038 How Many Answers Are Wrong
- 陈怡暖:金价发力飙升,直逼千二关口,该怎么办?
- STM32之ADC配置
- MFC动态创建菜单及添加相应
- 基于ubuntu编写的几个shell脚本
- poi导出word表格jar包
- npm换源