iOS开发--数据库管理CoreData的使用
2017-02-17 10:37
441 查看
CoreData是iOS5后,苹果提供的原生的用于对象化管理数据并且持久化的框架。CoreData本质上是将底层数据库封装成对象进行管理。但数据库实际上只是CoreData的一个功能,并不是全部功能。在iOS开发中,除了可以使用CoreData进行数据管理,还可以使用SQLite进行内存管理。并且有封装好SQLite代码的OC框架FMDB给我们使用。具体看我上篇文章。SQLite重要框架FMDB的使用.但对比SQLite,CoreData有下面几个优势。第一是CoreData作为苹果提供的原生框架,在内存方法比SQLite有性能上的优势。第二是CoreData操作数据不需要使用SQLite代码,使用方便。第三是CoreData把数据用面向对象方式进行管理,操作数据库更方便。
CoreData的核心是Core Data stack(技术栈堆)。CoreData就是依靠Core Data stack中的几个对象进行数据操作的。这几对象是:
NSManagedObjectContext ,管理对象的上下文: 负责管理模型对象的一个集合,
NSManagedObjectModel 被管理的对象模型
NSPersistentStoreCoordinator 存储调度器: 负责将数据保存到磁盘,
NSPersistentStore用于保存模型数据,受NSPersistentStoreCoordinator 存储调度器的操控。
这三个对象的关系如下面图片所示,苹果官方给出了这几个对向关系的图解。简单理解起来就是最上面的NSManagedObjectContext负责管理对象模型。然后将管理的对象模型发送给NSPersistentStoreCoordinator 存储调度器,存储调度器通过NSPersistentStore操作SQLite语句,将数据持久化到本地,保存到StoryFile中。
Paste_Image.png
Paste_Image.png
Paste_Image.png
数据库的使用也很简单,我们只需要在创建项目文件的时候勾选使用coreData的选项,系统就会帮我们创建一个包含CoreData的项目文件。
Paste_Image.png
然后在界面上就会出现下面的变化。我们点击添加属性按钮,就能在数据库中给数据模型添加属性。
Paste_Image.png
添加完数据库后我们进行下面操作就能将数据模型转为代码文件。
Paste_Image.png
做完上面操作之后我们就能对数据库模型进行操作了。
Paste_Image.png
我们在操作数据,对数据进行增删改查的时候,都需要用到Core Data stack这个工具。我们自己可以封装一个Core Data stack,这样更能加深我们对Core Data stack这个工具的理解。
下面是封装一个工具类的代码:
首先是该工具类的.h文件中的代码
#import <Foundation/Foundation.h> #import <CoreData/CoreData.h> #define KXBCoreManagerInstance [HMCoreDataStackManager shareInstance] @interface HMCoreDataStackManager : NSObject ///单例 +(HMCoreDataStackManager*)shareInstance; ///管理对象上下文 @property(strong,nonatomic)NSManagedObjectContext *managerContenxt; ///模型对象 @property(strong,nonatomic)NSManagedObjectModel *managerModel; ///存储调度器 @property(strong,nonatomic)NSPersistentStoreCoordinator *maagerDinator; //保存数据的方法 -(void)save; @end
然后是.m文件中的代码
#import "HMCoreDataStackManager.h" @implementation HMCoreDataStackManager ///单例的实现 +(HMCoreDataStackManager*)shareInstance { static HMCoreDataStackManager *instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[HMCoreDataStackManager alloc]init]; }); return instance; } -(NSURL*)getDocumentUrlPath { ///获取文件位置 return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] ; } //懒加载managerContenxt -(NSManagedObjectContext *)managerContenxt { if (_managerContenxt != nil) { return _managerContenxt; } _managerContenxt = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType]; ///设置存储调度器 [_managerContenxt setPersistentStoreCoordinator:self.maagerDinator]; return _managerContenxt; } ///懒加载模型对象 -(NSManagedObjectModel *)managerModel { if (_managerModel != nil) { return _managerModel; } _managerModel = [NSManagedObjectModel mergedModelFromBundles:nil]; return _managerModel; } -(NSPersistentStoreCoordinator *)maagerDinator { if (_maagerDinator != nil) { return _maagerDinator; } _maagerDinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:self.managerModel]; //添加存储器 /** * type:一般使用数据库存储方式NSSQLiteStoreType * configuration:配置信息 一般无需配置 * URL:要保存的文件路径 * options:参数信息 一般无需设置 */ //拼接url路径 NSURL *url = [[self getDocumentUrlPath]URLByAppendingPathComponent:@"sqlit.db" isDirectory:YES]; [_maagerDinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil]; return _maagerDinator; } -(void)save { ///保存数据 [self.managerContenxt save:nil]; }
通过上面代码可以看出封装一个Core Data stack类并不是很难,我们需要做的是创建一个单例,然后懒加载一个NSManagedObjectContext,并给NSManagedObjectContext添加存储调度器NSPersistentStoreCoordinator。
懒加载存储调度器的时候给存储调度器添加存储器PersistentStore。在最后提供一个保存数据的方法,每次我们修改数据库中文件数据的时候,都需要用Core Data stack调用save方法保存数据。
CoreData关于数据的操作无非就是增删改查。增删改查我们同样需要使用自定义的Core Data stack工具类。
增加数据:
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" in Managed ObjectContext : kManagedObjectContext.managedObjectContext]; p.age = @(13); p.name = @"张三"; [kManagedObjectContext save];
删除数据:
//1.创建一个查询请求 NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"]; //2.创建查询谓词(查询条件) NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"张三"]; //3.给查询请求设置谓词 request.predicate = predicate; //4.查询数据 NSArray<Person*> *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil]; //5.删除数据 [kManagedObjectContext.managedObjectContext deleteObject:arr.firstObject]; //6.同步到数据库 [kManagedObjectContext save];
修改数据:
//1.创建一个查询请求 NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"]; //2.创建查询谓词(查询条件) NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"张三"]; //3.给查询请求设置谓词 request.predicate = predicate; //4.查询数据 NSArray<Person*> *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil]; //5.改变数据 arr.firstObject.name = @"李四"; arr.firstObject.age = @(18); //6.同步到数据库 [kManagedObjectContext save];
查询数据:
//1.创建一个查询请求 NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"]; //2.创建查询谓词(查询条件) NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"张三"]; //3.给查询请求设置谓词 request.predicate = predicate; //4.查询数据 NSArray<Person*> *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil]; NSLog(@"%@====%@",arr.firstObject.name,arr.firstObject.age);
使用CoreData我们可以轻松实现很多数据的操作,例如通讯录数据录的增删改查。
在这里提供一个通讯录数据操作的demo,使用CoreData,我们能轻松地实现通讯录功能。
CoreData实现通讯录
原文链接:http://www.jianshu.com/p/e7411f3ceeb6
相关文章推荐
- iOS开发过程中使用Core Data应避免的十个错误
- ios已上架的APP更新,使用core data的需要升级core Data数据库,这样做
- iOS开发过程中使用Core Data应避免的十个错误
- IOS-Coredata 核心数据库的基础使用
- iOS开发-CoreData的简单使用
- ios开发使用CoreData存储数据时,快速写下FetchRequest语句操作
- iOS:CoreData数据库的使用二(创建多个数据库表,表之间有对应关系)
- iOS:CoreData数据库的使用一(创建单个数据库表)
- 详解iOS应用开发中Core Data数据存储的使用
- iOS开发中coredata的使用和数据持有化
- 【iOS】数据库Core Data的使用
- iOS开发过程中使用Core Data应避免的十个错误
- [ios开发基础之 Core Data[3]]如何使用NSFetchedResultsController 来集成TableView操作
- iOS App开发中Core Data框架基本的数据管理功能小结
- iOS开发:coredata的简单使用
- IOS开发 core data 简单使用和注意
- iOS开发-CoreData的简单使用
- XMPP框架 微信项目开发之CoreData学习——使用CoreData建立多个数据库
- iOS:CoreData数据库的使用三(数据库和tableView表格一起使用)
- iOS:CoreData数据库的使用四(数据库和UITableViewController以及NSFetchedResultsController一起使用)