Coredata — 入门使用

CoreData的底层实现尽管是使用的sqlite数据库。但是CoreData在使用起来但是和sqlite大相径庭。可能你会发现你连一句sql语句都不要写。CoreData存在于应用程序和持久化存储区之间,扮演了桥梁的角色,将托管的对象映射到持久化存储区其中。

1.设置上下文

在代码開始之前还须要加入CoreData框架,并在合适的地方引入头文件<CoreData/CoreData.h>:

  1. // 从应用程序包中载入模型文件
  2. NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
  3. // 传入模型对象。初始化NSPersistentStoreCoordinator
  4. NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
  5. // 构建SQLite数据库文件的路径
  6. NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"model.data"];
  7. // 将数据库路径转成URL
  8. NSURL *url = [NSURL fileURLWithPath:filePath];
  9. // 加入持久化存储库,这里使用SQLite作为存储库
  10. NSError *error = nil;
  11. NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
  12. // 推断数据库是否加入成功
  13. if (store == nil) {
  14. [NSException raise:@"加入数据库错误" format:@"%@", [error localizedDescription]];
  15. }
  16. // 初始化上下文
  17. NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
  18. // 设置persistentStoreCoordinator属性
  19. context.persistentStoreCoordinator = psc;

2.加入数据

  1. // 创建一个Husband实体对象,传入上下文
  2. NSManagedObject *husband = [NSEntityDescription insertNewObjectForEntityForName:@"Husband" inManagedObjectContext:context];
  3. // 通过键值编码的方式设置Husband的name属性
  4. [husband setValue:@"jack" forKey:@"name"];
  5. // 通过coredata生成的实体类来创建一个Wife实体对象,传入上下文
  6. Wife *wife = [NSEntityDescription insertNewObjectForEntityForName:@"Wife" inManagedObjectContext:context];
  7. // 通过setter方法设置属性
  8. wife.name = @"rose";
  9. // 设置Husband和Wife之间的关联关系(一方关联,还有一方自己主动关联)
  10. wife.husband = husband;
  11. // 利用上下文对象,将数据同步到持久化存储库
  12. BOOL success = [context save:&error];
  13. if (!success) {
  14. [NSException raise:@"訪问数据库错误" format:@"%@", [error localizedDescription]];
  15. }
  16. // 假设是想做更新操作:须要将实体对象先查询出来。在更改了实体对象的属性后调用[context save:&error],就能将更改的数据同步到数据库

3.查询数据

  1. // 初始化一个查询请求
  2. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  3. // 设置要查询的实体
  4. request.entity = [NSEntityDescription entityForName:@"Husband" inManagedObjectContext:context];
  5. // 设置排序(依照name降序)
  6. NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:NO];
  7. request.sortDescriptors = [NSArray arrayWithObject:sort];
  8. // 设置条件过滤(搜索name中包括字符串"ja"的记录)
  9. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@", @"*ja*"];
  10. request.predicate = predicate;
  11. // 运行请求,返回一个数组
  12. NSArray *objs = [context executeFetchRequest:request error:&error];
  13. if (error) {
  14. [NSException raise:@"查询错误" format:@"%@", [error localizedDescription]];
  15. }
  16. // 遍历数据
  17. for (NSManagedObject *obj in objs) {
  18. NSLog(@"name=%@", [obj valueForKey:@"name"]);
  19. // 实体属性中包括还有一个实体。不须要再次设置查询请求,Core Data会依据关联关系查询到关联的实体信息
  20. NSLog(@"wife = %@", [[obj valueForKey:@"wife"] valueForKey:@"name"]);
  21. }

fetchRequest相当于sql查询语句的包装类。须要用setEntity方法,来指定详细查询的实体结构(表结构);

通过NSEntityDescription的entityForName方法来。返回指向该详细实体结构的指针;

然后调用executeFetchRequest:error:方法,来运行查询操作,假设操作成功,则返回相应的数据记录数组。

当中,能够通过NSManagedObject数据记录对象里关联的属性,查询还有一个数据记录对象里的属性;

CoreData不会依据实体中的关联关系马上获取对应的关联对象,比方通过CoreData取出Husband实体时。并不会马上查询相关联的Wife实体;当应用真的须要使用Wife时,才会再次查询数据库。载入Wife实体的信息。这个就是CoreData的延迟载入机制。

4.删除数据

Core Data的增删改使用的方法都是save:方法,在上下文调用save方法之前,全部的数据改动都是发生在内存中的。仅仅有调用save方法后,上下文中发生的数据改动才会被写入到持久化存储区。

获取到须要删除的实体对象之后。调用deleteObject:方法就能够从上下文中删除这个实体对象了,最后须要调用save:方法同步改动到数据库中:

  1. // 初始化一个查询请求
  2. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  3. // 设置要查询的实体
  4. request.entity = [NSEntityDescription entityForName:@"Husband" inManagedObjectContext:context];
  5. // 设置条件过滤(搜索name等于jack2的实体)
  6. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", @"jack2"];
  7. request.predicate = predicate;
  8. // 运行请求,返回一个数组
  9. NSArray *objs = [context executeFetchRequest:request error:&error];
  10. if (error) {
  11. [NSException raise:@"查询错误" format:@"%@", [error localizedDescription]];
  12. }
  13. // 遍历数据
  14. for (NSManagedObject *obj in objs) {
  15. // 传入须要删除的实体对象
  16. [context deleteObject:obj];
  17. // 将结果同步到数据库
  18. [context save:&error];
  19. if (error) {
  20. [NSException raise:@"删除错误" format:@"%@", [error localizedDescription]];
  21. }
  22. }

5.新建project时勾选Use Core Data选项的情况

在新建project时使用CoreData,系统会帮我们在AppDelegate中搭建好一个上下文环境,我们能够在其它的controller中去使用这个context,省去了自己搭建上下文的操作,使用起来很简便。

AppDelegate.h中:

  1. @interface AppDelegate : UIResponder
  2. @property (strong, nonatomic) UIWindow *window;
  3. // 搭建上下文环境须要使用的对象
  4. @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
  5. @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
  6. @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
  7. // 保存实体对象到数据库中
  8. - (void)saveContext;
  9. // 取得程序沙盒路径的URL
  10. - (NSURL *)applicationDocumentsDirectory;
  11. @end

AppDelegate.m中:

  1. #pragma mark - Core Data stack
  2. @synthesize managedObjectContext = _managedObjectContext;
  3. @synthesize managedObjectModel = _managedObjectModel;
  4. @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
  5. - (NSURL *)applicationDocumentsDirectory {
  6. // The directory the application uses to store the Core Data store file. This code uses a directory named "edu.hcit.qqqqq" in the application‘s documents directory.
  7. return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
  8. }
  9. - (NSManagedObjectModel *)managedObjectModel {
  10. // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
  11. if (_managedObjectModel != nil) {
  12. return _managedObjectModel;
  13. }
  14. /**************************************************************************************************/
  15. // model 是模型文件的名称,默认是和项目名称同样的
  16. NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"model" withExtension:@"momd"];
  17. _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  18. return _managedObjectModel;
  19. }
  20. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
  21. // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it.
  22. if (_persistentStoreCoordinator != nil) {
  23. return _persistentStoreCoordinator;
  24. }
  25. // Create the coordinator and store
  26. _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
  27. /**************************************************************************************************/
  28. // 以下的数据库 model.sqlite 是存储实体数据的数据库
  29. NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"model.sqlite"];
  30. NSError *error = nil;
  31. NSString *failureReason = @"There was an error creating or loading the application‘s saved data.";
  32. if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
  33. // Report any error we got.
  34. NSMutableDictionary *dict = [NSMutableDictionary dictionary];
  35. dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application‘s saved data";
  36. dict[NSLocalizedFailureReasonErrorKey] = failureReason;
  37. dict[NSUnderlyingErrorKey] = error;
  38. error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
  39. // Replace this with code to handle the error appropriately.
  40. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
  41. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
  42. abort();
  43. }
  44. return _persistentStoreCoordinator;
  45. }
  46. - (NSManagedObjectContext *)managedObjectContext {
  47. // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
  48. if (_managedObjectContext != nil) {
  49. return _managedObjectContext;
  50. }
  51. NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
  52. if (!coordinator) {
  53. return nil;
  54. }
  55. _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
  56. [_managedObjectContext setPersistentStoreCoordinator:coordinator];
  57. return _managedObjectContext;
  58. }
  1. #pragma mark - Core Data Saving support
  2. - (void)saveContext {
  3. NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
  4. if (managedObjectContext != nil) {
  5. NSError *error = nil;
  6. if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
  7. // Replace this implementation with code to handle the error appropriately.
  8. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
  9. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
  10. abort();
  11. }
  12. }
  13. }

假设在一个已有的project中加入CoreData。搭建上下文时能够新建一个使用CoreData的project,将上述的代码复制到已有project,在AppDelegate.m中将模型文件的名称和数据库名称稍作改动就可以。数据的操作方法与上文类似。

6.打印隐藏的SQL语句

在Edit Scheme中选择Run,之后进入Arguments标签,加入參数:“-com.apple.CoreData.SQLDebug 1”

打开SQL语句隐藏开关后,程序在执行时。debug日志里会打印程序执行的SQL语句:

时间: 2024-08-04 06:04:01

Coredata — 入门使用的相关文章

CoreData入门

  一.简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的.简单地用下图描述下它的作用: 左边是关系模型,即数据库,数据库里面有张person表,person表里面有id.name.age三个字段,而且有2条记

CoreData 入门使用 增删改查 swift

首先新建一个 点击新建的testInfo.xcdatamodeld 会出现这么个界面 创建完testInfo.xcdatamodeld之后 AppDelegate 会自动帮你添加支持coredata的代码 有兴趣的自己研究 首先 使用coredata 存储数据 1.创建表 2.创建字段 3.创建对应字段的模型类 就足够了 创建表 点击 然后出现 添加字段 .................... 创建对应字段的模型  command+n  都勾上之后会自动帮你创建一个类  好 一切准备完毕.  

iOS coreData入门

1.创建程序时勾选coredata 2.在core.xcdatamodeld文件中建立表User 使用时,先为User表创建modal类,继承自NSManagedObject 在AppDelegate中会有自动生成的几个属性用来数据库访问等 数据库增删改查过程:先将结果查询出来,在查询出来的结果上进行数据操作,最后再保存回去 1.增 User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inM

CoreData的数据存储

前言 CoreData是iOS开发中经常使用的数据持久化的技术.但其操作过程稍微繁琐,即使你只是实现简单的存取,不涉及请求优化,也要进行许多配置工作,代码量在动辄几十行,对新手来说也需要较大时间成本. MagicalRecord是OC的一个库,协助方便CoreData的工作.其吸收了Ruby on Rails的Active Record模式,目标是: 简化Core Data相关代码 允许清晰,简单,单行获取 当需要优化请求的时候,仍然允许修改NSFetchRequest 安装 1.在 githu

怎么入门iOS之OC_UI晋级学什么、

1. OC 语法初步, 你可能学到面向对象最近本的概念, 并且可以大致的建立几个自以为是的类,但这仅仅是开始. 你知道为什么面向对象要有3大特性么.知道他们是用到什么设计模式的么 2. 你可能学到了NSString, NSMutableString 字符串的基本操作方法, 你可能会花大量的时间去看那些方法. 从没考虑过方法的实用性. UI方法成千上万, 大量的时间浪费到寻找上边可能会很累的. 所以, 学会现用现看 3. 你可能学到了NSArray, NSMutableArray, NSDicti

MagicalRecord入门教程

MagicalRecord入门教程 分类: ios开发2014-03-13 23:53 1012人阅读 评论(1) 收藏 举报 目录(?)[+] Magical Record是什么 在Cocoa中存在一种技术叫Core Data,用来对数据进行持久化,类似于Java世界中的Hibernate.在新建Cocoa Application/iOS Application的向导中,有一个选项是要不要使用Core Data,当启用以后你会发现在AppDelegate.m中添加了大量与Core Data相关

Core Data入门

Core Data入门 标签: Core DataiosiOSIOS数据存取数据库数据持久化 简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的.简单地用下图描述下它的作用: 左边是关系模型,即数据库,数据库里

Core Data浅谈初级入门

Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的hibernate持久化框架,不过功能肯定是没有Hibernate强大的.简单地用下图描述下它的作用: 左边是关系模型,即数据库,数据库里面有张person表,person表里面有id.name.age三个字段,而且有2条记录: 右边是对

这可能是最详细的 iOS 学习入门指南(含书目/文档/学习资料)

1 零基础小白如何进行 iOS 系统学习 首先,学习目标要明确: 其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走: 再次,学技术最重要的一点就是多动手. 推荐书目: <Objective-C 基础教程> <iOS 编程> <iOS 开发指南> 推荐两个开源的 APP:SegmentFault.懒人笔记 2 基础入门后,如何进行高级进阶 2.1 原理和基础:掌握扎实的原理和基础是进阶的必要条件 首先是语言.入门时候可能只要对