CoreData基本教程

来源:互联网 发布:淘宝优站网址 编辑:程序博客网 时间:2024/05/16 08:02

CoreData基本教程

   第一,工程中引入CoreData步骤

      1.添加CoreData Framework框架

      2.创建Data Model(数据模型)
          New File -> Core Data -> Data Model
      3.添加实体表和属性
          Data Model -> Add Entity ->Add Attributes添加字段属性
      4.创建实体对象类
          方法1:选中Entity:Xcode的菜单Editor -> Create NSManagedObject SubClass…
                        这样可以自动生成与实体表相关连的实体类.h.m.
                        选择实体表 查看属性,名称和关联类名应该都已经是自动关联成功的了。

          方法2:如果手动创建实体类.h.m文件,那么要手动实现与实体表的关联,否则实体表默认关联NSManagedObject,这样就会造成错误。

                         PS:个人项目中曾出现过类似的错误,生成实体之后实体调用它的实例方法会崩溃,实体不能识别它的实体方法。

      5.编写coreData代码

          首先说明,这部分编写的代码是为了引入CoreData到工程中,可以新建一个包含CoreData的空白工程,然后完全Copy其AppDegate中的引入CoreData方法即可。

          代码部分:

          <1>AppDelegate中引入头文件

#import <CoreData/CoreData.h>

          <2>增加属性及方法声明

@property (readonly,retain,nonatomic)NSManagedObjectContext *managedObjectContext;

@property (readonly,retain,nonatomic)NSManagedObjectModel *managedObjectModel;

@property (readonly,retain,nonatomic)NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;

- (NSURL *)applicationDocumentsDirectory;

          <3>AppDelegate.m中实现CoreData方法

#pragma mark -

#pragma mark CoreData Methods

- (void)saveContext

{

   NSError *error =nil;

   NSManagedObjectContext *managedObjectContext =self.managedObjectContext;

   if (managedObjectContext !=nil) {

       if ([managedObjectContexthasChanges] && ![managedObjectContextsave:&error]) {

           NSLog(@"Unresolved error %@, %@", error, [erroruserInfo]);

           abort();

        }

    }

}

#pragma mark - Core Data stack

// Returns the managed object context for the application.

// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.

- (NSManagedObjectContext *)managedObjectContext

{

    if (_managedObjectContext !=nil) {

        return_managedObjectContext;

    }

    

    NSPersistentStoreCoordinator *coordinator = [selfpersistentStoreCoordinator];

   if (coordinator !=nil) {

        _managedObjectContext = [[NSManagedObjectContextalloc]init];

        [_managedObjectContextsetPersistentStoreCoordinator:coordinator];

    }

    return_managedObjectContext;

}


// Returns the managed object model for the application.

// If the model doesn't already exist, it is created from the application's model.

- (NSManagedObjectModel *)managedObjectModel

{

    if (_managedObjectModel !=nil) {

        return_managedObjectModel;

    }

     

    NSURL *modelURL = [[NSBundlemainBundle]URLForResource:@"XSTestModel"withExtension:@"momd"];

    _managedObjectModel = [[NSManagedObjectModelalloc]initWithContentsOfURL:modelURL];

    return_managedObjectModel;

}


// Returns the persistent store coordinator for the application.

// If the coordinator doesn't already exist, it is created and the application's store added to it.

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

{

    if (_persistentStoreCoordinator !=nil) {

        return_persistentStoreCoordinator;

    }

    

    NSURL *storeURL = [[selfapplicationDocumentsDirectory]URLByAppendingPathComponent:@"XSTestModel.sqlite"];//数据库的名字

    

    NSError *error =nil;

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinatoralloc]initWithManagedObjectModel:[selfmanagedObjectModel]];

    if (![_persistentStoreCoordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:storeURLoptions:nilerror:&error]) {

       NSLog(@"Unresolved error %@, %@", error, [erroruserInfo]);

       abort();

    }

    return_persistentStoreCoordinator;

}

#pragma mark - Application's Documents directory

// Returns the URL to the application's Documents directory.

- (NSURL *)applicationDocumentsDirectory

{

    return [[[NSFileManagerdefaultManager]URLsForDirectory:NSDocumentDirectoryinDomains:NSUserDomainMask]lastObject];

}

参考文章:

        http://hi.baidu.com/excalibur/item/ba72fb0f73c9f1c32f4c6b36

  第二.CoreData的增删查

            <1>新建实体

- (void)newEntity{

    // 创建TestData 被管理对象实例

    TestData *testData = (TestData *)[NSEntityDescriptioninsertNewObjectForEntityForName:@"TestData"

                                                                   inManagedObjectContext:_managedObjectContext];

    //属性赋值

    testData.creatTime = [NSDatedate];

    // 保存数据,持久化存储 SQLite数据库

    NSError *error =nil;

    if ([_managedObjectContextsave:&error])

    {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

        abort();

    }

}

        <2>删除实体

- (void)deleteEntity:(NSManagedObject *)aEntity

{

    // 删除实体

    [_managedObjectContextdeleteObject:aEntity];

    // 保存数据,持久化存储

    NSError *error =nil;

    if (![_managedObjectContextsave:&error]) {

        //handle error

    }

}

    <3>查询实体

- (NSArray *)getEntity

{

    // NSFetchRequest 对象用来检索数据

    NSFetchRequest *request = [[NSFetchRequestalloc]init];


    // 根据指定Entity名称和被管理对象上下文,创建NSEntityDescription对象,

    NSEntityDescription *myEntityQuery = [NSEntityDescription

                                         entityForName:@"TestData"

                                         inManagedObjectContext:_managedObjectContext];

    // 指定实体

    [requestsetEntity:myEntityQuery];

    

    //排序 按照时间排序

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptoralloc]initWithKey:@"creatTime"ascending:NO];

    NSArray *sortDescriptors = [[NSArrayalloc]initWithObjects:sortDescriptor,nil];

    [requestsetSortDescriptors:sortDescriptors];

    [sortDescriptorsrelease];

    [sortDescriptorrelease];

    

    NSError *error =nil;

    // 返回符合查询条件NSFetchRequest的记录数组

    NSArray *personArr = [self.managedObjectContextexecuteFetchRequest:requesterror:&error];

    [requestrelease];

         return personArr;

}

    第三.实体表关系及属性  
         增加实体表关系:Entity -> Add RelationShip 或者 选中Entity,按住Control键,拖向创建关系的表。这种方式会自动创建反相关联
         <1>关系名称必须首字母小写
         <2>Apple建议每一个关系都创建一个反向关系(inverse)。没有反向关联的话会有一个数据库警告
         <3>To-Many Relationship属性,代表着一对多的关系,一个实体可以关联多个。
         <4>Delete Rule选项可以选择Cascade,实现级联删除,表示在使用Core Data删除表的一个对象时,与其关联的其他表的对象也将被一起删除。
      第四.实体属性字段   

         增加字段Entity -> Add Attributes

         <1>应该保证实体表中的字段与关联的实体类中字段一致,可以修改一次实体表就重新生成一次实体类,或者修改实体表同时手动修改实体类。

         <2>NSManagedObject的字段属性的实现需要使用@dynamic而非@synthsize,不需要系统生成其存取方法,有数据库负责其存取。

         属性的类型(type)和(propertites)

    第五.其他相关

      CoreData简介:
      1.应用程序先创建或读取模型文件(后缀为xcdatamodeld)生成 NSManagedObjectModel 对象。Document应用程序是一般是通过 NSDocument 或其子类 NSPersistentDocument)从模型文件(后缀为 xcdatamodeld)读取。
      2.然后生成 NSManagedObjectContext 和 NSPersistentStoreCoordinator 对象,前者对用户透明地调用后者对数据文件进行读写。
      3.NSPersistentStoreCoordinator 负责从数据文件(xml, sqlite,二进制文件等)中读取数据生成 Managed Object,或保存 Managed Object 写入数据文件。
      4.NSManagedObjectContext 参与对数据进行各种操作的整个过程,它持有 Managed Object。我们通过它来监测 Managed Object。监测数据对象有两个作用:支持 undo/redo 以及数据绑定。这个类是最常被用到的。
      5.Model类
         Model类包含内容:     
         Entity(实体表),为NSMnanagedObject类或者其子类,抽象数据类型。
         Property三种属性:Attribute(用于存储实体表的基本数据),RelationShip(存储关系),FetchedRequest查询条件);
      6.ManagedObject类
         ManagedObject为Entity的一条记录,每一个ManagedObject被创建时都有一个全局的NSManagedObjectID,当它别插入到ManagedObjectContext中时,可以通过ID在Context中查询到它。
         ManagedOBjectContext管理者对数据对象的每一个操作。
         Persistent Store Coordinator用来处理与底层硬件相关的存取操作,一般ManagedObjectContext已经完成了对它的控制和操作,我们无需关心。
FetchRequest
       7.FetchRequest与谓词NSPredicate一起作用,用来在NSManagedObjectContext中查询符合条件的实体,结果以NSArray形式给出。通常会见FetchRequest保存以重复利用。

0 0
原创粉丝点击