IOS CoreData 使用 (一)

来源:互联网 发布:知乎 智能晾衣架 编辑:程序博客网 时间:2024/05/01 13:01
一 Core Data是什么

   Core Data是一中基于数据模式(schema)的数据管理解决方案,在IOS系统架构中位于核心服务层。Core Data也可以看作是ORM( 对象关系映射Object Relational Mapping,简称ORM)在IOS平台的实现。
   
   ORM的实质就是将关系数据库中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程。在ORM过程中最重要的概念是映射(Mapping),通过这种映射可以使业务对象与数据库分离。从面向对象来说,数据库不应该和业务逻辑绑定到一起,ORM则起到这样的分离作用,使数据库层透明,开发人员真正的面向对象。
   
    Core Data是苹果提供的用于持久化数据的框架Core Data把我们的数据模型以对象的形式持久化到普通文件或者数据库中。它不但可以将我们的数据模型以对象的形式来表示,而且还可以组织对象间的关系。除此之外,它还可以帮助我们查询 排序数据等。
  
    苹果应用程序的开发使用MVC设计模式,其中M代表的是数据模型(Data Model),而Core Data就是用来管理数据模型的一个好的工具。对象视图管理是Core Data强大的功能之一。

二 Core Data  Stack 介绍

   Core Data 有四部分组成:

   NSManageObjectModel                  受控对象模型
   NSPersistenceStore                        持久化存储
   NSPersistenceStoreCoordinator     持久化存储调度器
   NSManagedObjectContext             受控对象上下文




       受控对象上下文用来管理对象视图,跟踪托管对象(受控对象)的状态;
       受控对象上下文使用持久化存储调度器实现对受控对象模型中的受控对象存取操作;
       持久化存储调度器使用持久化存储来存储数据,连接了受控对象上下文和持久化存储。
       持久化存储可以是普通的文件,也可以是数据库(Sqlite),是对实际存储文件的抽象。
   
    注: 
            一般情况下,我们使用一个受控对象上下文,但是对于一些高级的应用也可以拥有多个对象上下文,最常见的是在每个队列中创建一个对象上下文。
      每个托管对象会记录其所拥有的对象上下文,同时每个托管对象也知道它说属于哪个对象上下文。

            一般情况下,持久化存储调度器(PSR)和一个持久化存储绑定,但是也可以将多个持久化存储添加到一个
      PSR上。
         
            下面的方案是我们经常用到的:
    


 2.1 受控对象模型

       受控对象模型是一种模式,它定义了应用中的数据结构。受控对象模型存储在文件中,扩展名为.xcdatamodeld,可以使用Xcode自带的图形化用户界面工具来编辑,该工具名为Core Data模型编辑器。

      我们可以使用Core Data模型编辑器定义实体,包括实体的名字,实体的属性,实体间的关系(一对一,多对一,继承),如下图所示:
        
    
  
       定义四个五个实体,其中Zone和CricleZone PolygonZone是继承的关系,PolygonZone和Location是一对多的关系。

     下面是由以上的实体生成的部分代码
 
Zone.h

#import <CoreData/CoreData.h>

@interface Zone : NSManagedObject
@property (nonatomicretainNSNumber * zoneid;
@property (nonatomicretainNSString * name;
@property (nonatomicretainNSNumber * belong;
@property (nonatomicretainNSNumber * type;
@property (nonatomicretainNSNumber * shape;
@end

Polygon.h

#import <CoreData/CoreData.h>
#import 
"Zone.h"

@class Location;
@interface PolygonZone : Zone

@property (nonatomicretainNSSet *points;
@end

@interface PolygonZone (CoreDataGeneratedAccessors)

- (
void)addPointsObject:(Location *)value;
- (
void)removePointsObject:(Location *)value;
- (
void)addPoints:(NSSet *)values;
- (
void)removePoints:(NSSet *)values;

@end

注:
    1.每个NSManagedObject子类对象都有一个objectID属性,这个属性的值在所有队列范伟内是一致的。如果某种情况下需要在相应的队列之外使用对象,可以用受控对象下文的objectForID方法类确定操作的对象是否正确。
   
     

2.2 持久化存储调度器

    通过受控对象模型可以创建一个持久化调度器。这个对象模型定义的实体和实体间的关系受到调度器的管理。
    虽然持久化调度器在Core Data中扮演着重要的角色,但它基本上是一个自动的过程。在应用中使用Core Data时,除了一开始创建过程之外,在应用的整个生命周期中,并不需要担心如何操作这个调度器。

    
     
2.3 持久化存储
  
    持久化存储的实质是对实际的数据库文件的一种Object-c表示。在真实的场景中,你其实没有必要去花费心思去创建新的持久化存储。相反,在确定了存储类型 配置 URL 和选项之后,就可以将新的持久化存储直接添加到一个已有的调度器中。

    现在IOS 6中,Core Data支持3中类型的数据存储,

    NSSQLiteStoreType 
    NSBinaryStorageType
    NSInMemoryStoreType

   第一中使用Sqlite数据库,数据能够根据需要进行加载和移除,节省内存,性能和效率比较高,在处理大型数据集时效率更高
   后面两种的缺点是,程序启动的时候数据会一次性全部装入内存中,占用大量的内存。
   
2.4 受控对象上下文
   
    Core Data中返回的是对象不是值。当对象被创建出来之后,它们就存储在一个受控对象上下文中,顾名思义,受控对象上下文的工作就是管理Core Data创建并返回的对象。

     当我们从自己定义的实体生成类时,这些类都说同一个对象的子类,即NSManagedObject,管理这些NSManagedObject对象的生命周期是受控对象上下文的职责。
  
     受控对象上下文监视并记录对象属性的修改信息,当修改完毕之后,只要调用上下文的保存操作,就可以让上下文将所有修改传递给调度器,保存到持久化存储中。
    
     受控对象上下文的职责之一就是追踪对象的任何改变。我们可以使用-insertedObjects-updatedObjects, 和deletedObjects 方法来知道在执行下次save操作的时候哪些对象将被添加 更改和删除。

     当Core Data栈创建完成后,我们主要使用的时受控对象上下文来完成对数据对象的增删改查的操作。

   注:
    1.在创建受控对象上下文的时候要记住,需要在对应的分发队列中创建和访问这个上下文中的对象。NSManagedObjectCotext不是线程安全的,只能在创建它的那个线程中去访问它。
    
     

三 Core Data栈的搭建

  3.1 模版创建
     
      新建项目的时候可以勾选上 Use Core Data选项,将自动的建立Core Data Stack.
  
  3.2 手动创建
   
      1.添加Core Data Framework
       

      
         2.打开 XXXXXXX-Prefix.pch (你自己的 pch 文件 ) 预编译文件,添加如下代码
          
     #import <CoreData/CoreData.h>
         
        3.在程序 XXXXDelegate.h中添加
        
    @property (readonlystrongnonatomicNSManagedObjectContext *managedObjectContext;
    @property (readonlystrongnonatomicNSManagedObjectModel  *managedObjectModel;
    @property (readonlystrongnonatomicNSPersistentStoreCoordinator *persistentStoreCoordinator;   
    
    4.在程序XXXXXXDelegate.m中添加

   @synthesize managedObjectContext = _managedObjectContext;
   @synthesize managedObjectModel   = _managedObjectModel;
   @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
   
 
    5.创建Core Data栈    
     
// *******创建受控对象模型**************
- (
NSManagedObjectModel *) managedObjectModel
{
    
if (_managedObjectModel != nil)
    {
        
return _managedObjectModel;
    }
    
    
NSURL *modelURL = [[NSBundle mainBundleURLForResource:@"Model" withExtension:@"momd"];
    
_managedObjectModel = [[NSManagedObjectModel allocinitWithContentsOfURL:modelURL];
    
return _managedObjectModel;
}

// *******创建持久化调度器**************  
- (NSPersistentStoreCoordinator *) persistentStoreCoordinator
{
    
if (_persistentStoreCoordinator != nil) {
        
return _persistentStoreCoordinator;
    }
    
    
NSURL *storeURL = [[self applicationDocumentsDirectoryURLByAppendingPathComponent:@"CoreDataDemo.sqlite"];
    
    
NSError *error = nil;
    
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator allocinitWithManagedObjectModel:[self managedObjectModel]];
    
    
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                   
configuration:nil
                                                             
URL:storeURL
                                                         
options:nil
                                                           
error:&error])
    {
        
/*
         Replace this implementation with code to handle the error appropriately.
         */

        
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        
abort();
    }
    
    
return _persistentStoreCoordinator;
}
// *******创建受控对象上下文**************  
- (NSManagedObjectContext *) managedObjectContext
{
    
if (_managedObjectContext != nil)
    {
        
return _managedObjectContext;
    }
    
    
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    
if (coordinator != nil)
    {
        
_managedObjectContext = [[NSManagedObjectContext allocinit];
        [
_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    
return _managedObjectContext;
}
// *******返回程序文档目录************** 
- (NSURL *)applicationDocumentsDirectory
{
    
return [[[NSFileManager defaultManagerURLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMasklastObject];
}
原创粉丝点击