zoukankan      html  css  js  c++  java
  • ios开发之CoreData使用

    1.在工程中添加build Phases的Link Binary with Libraries下添加CoreData的库。

    2.在当前工程中新建文件选择CoreData——>DataModel,新建一个数据模型,往该模型中添加实体Entity,entity就是对应sqlite里面的表,一个实体对应一张表,有多个表就添加多个实体,然后往实体里面添加属性attributes,attributes就是sqlite表中的列。

    3.在当前工程下右键新建CoreData ——>NSManageObject subclass,xcode会让你选择要生成的NSManageObjct subclass 的数据模型和实体,也就是说要生成对象模型所对应的数据库和表,添加完成后,新生成的对象模型里面有@dynamic 标记的对象,这是说对象的setter和getter方法由手动完成。

    4.在使用CoreData的源文件中添加头

    #import <CoreData/CoreData.h>

    5.CoreData使用需要用到三个对象:

    (1).NSManagedObjectContext

    (2).NSManagedObjectModel

    (3).NSPersistentStoreCoordinator

    NSManagedObjectContext是进行数据持久化时的上下文,NSManagedObjectContext初始化时需要指定:NSPersistentStoreCoordinator

    NSPersistentStoreCoordinator是数据持久化的助手,初始化时需要指定数据持久化时用到的数据存储类型:sqlite、xml、内存。还指定路径和NSManagedObjectModel

    NSManagedObjectModel是对象模型

    6.在源文件中添加三个属性:

    @property ( strong , nonatomic) NSManagedObjectContext * coreDataContext;
    @property ( strong , nonatomic) NSManagedObjectModel *   coreDataModel;
    @property ( strong , nonatomic) NSPersistentStoreCoordinator  * coreDataPersistent;
    

     并且进行延迟加载初始化:

    -(NSManagedObjectModel *) coreDataModel
    {
        if (_coreDataModel ==nil ) {
            _coreDataModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"resultsModel" withExtension:@"momd"]];
        }
        return _coreDataModel;
    }
    -(NSPersistentStoreCoordinator  *)coreDataPersistent
    {
        if (_coreDataPersistent==nil) {
            _coreDataPersistent = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self coreDataModel]];
            NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
            NSURL * pathURL = [NSURL  fileURLWithPath:[path stringByAppendingString:@"resultsModel.sqlite" ]];
            NSError * error = nil;
            NSPersistentStore * store = [ _coreDataPersistent  addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:pathURL options:nil error:&error] ;
            if (!store) {
                [NSException raise:@"add database error" format:@"%@" ,[error localizedDescription]];
            }
        }
        return _coreDataPersistent ;
    }
    
    -(NSManagedObjectContext *) coreDataContext
    {
        if(_coreDataContext ==nil)
        {
            _coreDataContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
            [_coreDataContext setPersistentStoreCoordinator:[self coreDataPersistent]];
        }
        return _coreDataContext;
    }
    

    NSManagedObjectModel需要指定对象模型xxx.momd这个是新建的CoreData:xxx.xcdatamodeld自动在bundle下生成的。

    插入数据:

     Results * insertResult = [NSEntityDescription insertNewObjectForEntityForName:@"Results" inManagedObjectContext: [self  coreDataContext]];
        insertResult.in = @"123";
        insertResult.re = @"ok";
        insertResult.reD = @"1";
        NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"YYYY-MM-dd hh:mm:ss"];
        insertResult.Time = [dateFormatter stringFromDate:[NSDate date]];
        NSError * error = nil;
        if(![[self coreDataContext] save: &error])
        {
            [NSException raise:@"save data to database error:" format:@"%@",[error localizedDescription]];
        }
    

     这里的in .re .reD .Time 分别对应实体Results里面的属性in .re .reD .Time 对它们赋值后调用 [context save:&error] 就直接保存到数据库中。

    读取数据:

     NSFetchRequest * databaseFecth = [[NSFetchRequest alloc] init];
        databaseFecth.entity = [NSEntityDescription entityForName:@"Results" inManagedObjectContext:[self coreDataContext]];
        
      
         NSArray * objs = [[self coreDataContext] executeFetchRequest:databaseFecth error:&error];
        if(error)
        {
            [NSException raise:@"fetch data from database error:" format:@"%@",[error localizedDescription]];
        }
        for (NSManagedObject * obj in objs) {
            NSLog(@"%@", obj);
        
        }
    

     需要注意的是如果直接使用_context而不是[self context] 来获取当前对象模型的上下文则会在运行时出错:

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Results''

    因为直接使用_context时是nil的,只有调用才不会为nil

  • 相关阅读:
    从Java角度理解Angular之入门篇:npm, yarn, Angular CLI
    大数据开发实战:Stream SQL实时开发一
    大数据开发实战:Spark Streaming流计算开发
    大数据开发实战:Storm流计算开发
    大数据开发实战:Hadoop数据仓库开发实战
    数据仓库中的拉链表
    java通过jdbc连接impala
    impala-shell常用命令
    Kudu-java数据库简单操作
    拉链表--实现、更新及回滚的具体实现( 转载)
  • 原文地址:https://www.cnblogs.com/panxiaochun/p/5284573.html
Copyright © 2011-2022 走看看