zoukankan      html  css  js  c++  java
  • Core Data的一些常见用法

    一、简介

    Core Data是一个纯粹的面向对象框架,其本质就是一个ORM(对象关系映射:Object Relational Mapping),能以面向对象的方式操作SQLite数据库。在实际开发中绝大部分情况下,Core Data底层都采用SQLite数据库作为持久化存储方式。它也允许把数据保存在内存中(设备重启后数据会丢失),也允许把数据存储为其他格式(如XML)。简单的讲,它就是用于操作实体以及实体之间的关联关系的持久化工具。

    二、Core Data的核心概念。

    1、实体

    实体就是由Core Data管理的模型对象,是NSManagedObject类或其子类的实例。

    实体与实体之间是1-1、1-N、N-N的关联关系。

    2、实体描述

    NSEntityDescription:该对象描述了实体的具体信息(如包含的所有属性等),相当于实体的抽象。

    3、托管对象模型

    NSManagedObjectModel:该对象负责管理所有实体以及实体之间的关联关系。一个托管对象模型对应一个数据库。

    4、托管对象上下文

    NSManagedObjectContext:简称上下文,一个上下文管理一个数据库,如果需要多个数据库则需要创建多个上下文。所有实体都处于所在上下文的管理中,实体的增、删、改、查操作都必须通过该对象来完成。类似于Hibernate的Session。

    5、持久化存储协调器

    NSPersistentStoreCoordinator:底层与NSManagedObjectContext相衔接,负责管理底层的存储形式(如SQLite数据库或XML等)。

    6、抓取请求

    NSRetchRequest:该对象封装了查询实体的请求,例如需要查询哪些实体、查询条件(通过NSPredicate来表示)、排序规则(用NSArray定义了所有的排序规则)等。

    三、使用Core Data的步骤。

    注:创建项目时如果勾选"Use Core Data"复选框,Xcode会自动完成所有Core Data必需资源的初始化,前3步会自动完成,此时需从第4步开始操作

    1、为项目导入CoreData.Framework框架。

    2、添加实体模型文件。

    Xcode → File → New → File → Data Model → next → "实体模型文件名".xcdatamodeld → create;

    3、初始化Core Data必需的核心API对象,这些是属于全局对象,一般会在AppDelegate中操作。

    (1)、在AppDelegate.h中添加3个核心属性,再添加一个执行存储的方法。

     1 #import <UIKit/UIKit.h>
     2 #import <CoreData/CoreData.h>
     3 
     4 @interface AppDelegate : UIResponder <UIApplicationDelegate>
     5 
     6 @property (strong, nonatomic) UIWindow *window;
     7 
     8 @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
     9 @property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;
    10 @property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
    11 
    12 - (void)saveContext;
    13 
    14 @end

    (2)、在AppDelegate.m中初始化NSManagedObjectModel。

    1 - (NSManagedObjectModel *)managedObjectModel {
    3     if (_managedObjectModel != nil) {
    4         return _managedObjectModel;
    5     }
    6     NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreData2" withExtension:@"momd"];
    7     _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    8     return _managedObjectModel;
    9 }

    (3)、以NSManagedObjectModel对象为基础,在AppDelegate.m中初始化NSPersistentStoreCoordinator,用于设置Core Data底层数据存储方式。

     1 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
     2     if (_persistentStoreCoordinator != nil) {
     3         return _persistentStoreCoordinator;
     4     }
     5     _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
     6     NSURL *storeURL =  [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
     7     storeURL = [storeURL URLByAppendingPathComponent:@"CoreData2.sqlite"];
     8     NSError *error = nil;
     9     if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
    10         NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    11         abort();
    12     }
    13     
    14     return _persistentStoreCoordinator;
    15 }                

    (4)、以NSManagedObjectModel对象为基础,在AppDelegate.m中初始化NSManagedObjectContext。

     1 - (NSManagedObjectContext *)managedObjectContext {
     2     if (_managedObjectContext != nil) {
     3         return _managedObjectContext;
     4     }
     5     
     6     NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
     7     if (!coordinator) {
     8         return nil;
     9     }
    10     _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    11     [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    12     return _managedObjectContext;
    13 }

    (5)、在AppDelegate.m中实现saveContext方法,用于保存数据。

     1 - (void)saveContext {
     2     NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
     3     if (managedObjectContext != nil) {
     4         NSError *error = nil;
     5         if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
     6             NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
     7             abort();
     8         }
     9     }
    10 }

    (6)、在AppDelegate.m中实现此方法,当应用在后台被终止时,保存上下文中的数据。

    1 - (void)applicationWillTerminate:(UIApplication *)application {
    2     [self saveContext];
    3 }

    经过以上3大步骤,Core Data项目初始化完成,当应用程序需要执行增、删、改、查等操作时,直接调用AppDelegate中的managedObjectContext属性即可操作。

    4、设计实体模型。

    单击Xcode项目导航中的"实体模型文件名".xcdatamodeld文件,打开实体模型开始编辑。

    (1)、实体:是实体模型的核心对象,实体必需是NSManagedObject类或其子类。点击"Add Entity"添加实体。

    (2)、抓取请求:是NSFetchRequest对象,实际开发中通常会在代码中创建。

    (3)、配置:系统默认配置,无需自行添加。

    (4)、属性:相当于实体对象的实例变量,在实体列表中选中刚生成的实体,点击"Add Attribute"添加属性。

    (5)、关联关系:定义实体之间的关联关系,如1-1、1-N、N-N。具体操作如下:

    选中实体 → 在Relationships下点击加号添加关联关系  → 在Relationship下填写关联关系名称 → 在Destination下选择目标实体 → 在Xcode属性面板的Type中选择关联类型 → 在Xcode属性面板的Delete Rule中选择级联类型。

    • Relationship:关联关系的名称。
    • Destination:关联关系的目标实体。
    • Inverse:建立实体与目标实体之间的关联关系,保持数据的完整性,不设置的话编译器会有警告。
    • Type中的To One:1-1.
    • Type中的To Many:1-N。                           // N-N的情况需设置其他的实体对此实体为1-N
    • Delete Rule的No Action:当主实体被删除时,关联的目标实体不变。
    • Delete Rule的Nullify:当主实体被删除时,关联的目标实体外键值被设置为null。
    • Delete Rule的Cascade:当主实体被删除时,关联的目标实体也被级联删除。
    • Delete Rule的Deny:当主实体被删除时,如果被关联的目标实体还存在,程序会拒绝删除主实体的操作。必需先删除关联的目标实体,才能删除主实体。

    (6)、抓取属性:在获取关联实体时可执行某个过滤条件。

    5、用实体模型生成实体。

    即以"实体模型文件名".xcdatamodeld文件中的某个实体为基础,为该实体生成NSManagedObject的子类。

    Xcode → File → New → File → NSManagedObject Subclass → 选择实体模型文件 → 选择文件中的实体(大于1个时) → create;

    6、实现数据的增、删、改、查。

    (1)、添加实体。

    • 调用NSEntityDescription的insertNewObjectForEntityForName:inManagedObjectContext:类方法添加新实体。
    • 设置新实体属性。
    •  调用NSManagedObjectContext对象的save方法保存上下文。
      1 HLAuthor *author = [NSEntityDescription insertNewObjectForEntityForName:@"HLAuthor" inManagedObjectContext:self.appDelegate.managedObjectContext];
      2 author.name = @"张三";
      3 author.authorDesc = @"xxx";
      4 NSError *error = nil;
      5 if (![self.appDelegate.managedObjectContext save:&error]) {
      6     NSLog(@"保存失败:%@, %@", error, error.userInfo);
      7 }

    (2)、删除实体。

    • 获取要删除的实体。
    • 调用NSManagedObjectContext对象的deleteObject:方法删除实体。
    • 调用NSManagedObjectContext对象的save方法保存上下文。
      1 HLAuthor *author = self.authorArray[indexPath.row];
      2 [self.appDelegate.managedObjectContext deleteObject:author];
      3 NSError *error = nil;
      4 if (![self.appDelegate.managedObjectContext save:&error]) {
      5     NSLog(@"删除失败:%@, %@", error, error.userInfo);
      6 }

    (3)、修改实体。

    • 获取要修改的实体。
    • 修改实体属性。
    • 调用NSManagedObjectContext对象的save方法保存上下文。
      1 HLAuthor *author = .....;
      2 author.name = .....;
      3 author.authorDesc = .....;
      4 NSError *error = nil;
      5 if ([self.delegate.managedObjectContext save:&error]) {
      6     NSLog(@"修改失败:%@, %@", error, error.userInfo);
      7 }

    (4)、查询实体。

    • 创建NSFetchRequest对象。
    • 通过NSEntityDescription对象,设置NSFetchRequest对象所要抓取的实体。
    • 通过NSFetchRequest对象的FetchOffset属性,可以设置分页的起始索引。
    • 通过NSFetchRequest对象的fetchLimit属性,可以设置每页的条数。
    • 通过NSPredicate对象,可以设置筛选条件。
    • 通过NSSortDescriptor对象,可以设置查询结果的排序规则。
    • 调用NSManagedObjectcontext对象的executeFetchRequest:error:方法执行查询,返回所有符合条件的结果集NSArray。
      1 NSFetchRequest *request = [[NSFetchRequest alloc] init];
      2 NSEntityDescription *entity = [NSEntityDescription entityForName:@"author" inManagedObjectContext:self.appDelegate.managedObjectContext];
      3 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"nane = %@", @"张三"];
      4 NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
      5 request.entity = entity;
      6 request.predicate = predicate;
      7 request.sortDescriptors = @[descriptor];
      8 NSError *error = nil;
      9 NSArray *result = [self.appDelegate.managedObjectContext executeFetchRequest:request error:&error];
  • 相关阅读:
    着迷
    网上找的所谓过滤
    最近很郁闷
    属性应用
    新版微软一站式示例代码浏览器全球发布 – Metro 界面带给你全新示例搜索浏览体验
    微软一站式示例代码库 2012示例代码发布第一期
    微软一站式示例代码库 8 月新代码示例发布
    如何在Visual Studio中直接使用示例代码浏览器搜索下载和管理代码示例
    一周最新示例代码回顾 (3/19–3/25)
    微软一站式示例代码库 2012 年2月示例代码更新。8个全新示例为您的开发保驾护航
  • 原文地址:https://www.cnblogs.com/hankkk/p/5715636.html
Copyright © 2011-2022 走看看