美文网首页macOS开发备忘录ios数据持久化
Core data 使用学习整理(快速上手)

Core data 使用学习整理(快速上手)

作者: lydsnm木鱼凡心 | 来源:发表于2015-12-06 13:00 被阅读548次

      Core Data是苹果针对Mac和iOS平台开发的一个框架, 通过CoreData可以在本地生成数据库sqlite,提供了ORM的功能,将对象和数据模型相互转换 . 通过Core Data管理和操作. 能够快速达到项目的存储数据的需求.
      CoreData优点:能够合理管理内存,避免使用sql的麻烦,高效, 由于是苹果提供的解决方案, 所以不用太过担心会有其他问题. 我的观念就是先使用上了后再考虑其他, 问题有一个就解决一个.
      Core Data 默认使用Sqlite. 因此在沙盒Document文件夹中找到.sqlite的数据库文件. 这里记录一个比较好用的快速打开模拟器沙盒路径的工具: https://github.com/opensim/opensim

    1.如何使用CoreData

    1. 创建工程时, 勾选Use Core Data.
    1. 手动添加, (如何要想向创建时没有选择Use Core Data)
      如果不知道该添加什么, 一个比较便捷的方法, 是直接新建一个空白工程, 勾选Use Core Data后, 对比AppDelegate.h中的代码, 然后再将多的内容添加到工程中.

    添加Core Data后, 在AppDelegate.h中就有帮我们生成用于管理、存储这些模型的对象,我们可以通过添加AppDelegate头文件来使用.
    添加Core Data后, 就是建立数据模型,说到模型, 就要提一下Core Data常用的6个对象:

    1、NSManagedObjectContext
    管理对象,上下文,持久性存储模型对象
    2、NSManagedObjectModel
    被管理的数据模型,数据结构
    3、NSPersistentStoreCoordinator
    连接数据库的
    4、NSManagedObject
    被管理的数据记录
    5、NSFetchRequest
    数据请求
    6、NSEntityDescription
    表格实体结构
    此外还需要知道.xcdatamodel文件编译后为.momd或者.mom文件

    一 开始

    右键添加一个Core data -> Data Model(如果创建工程时, 直接勾选use core data, 会直接默认生成.xcdatamodeld).
    选中.xcdatamodeld主要使用到了下列一些东西:
    Entity: 实体(我们要生成的模型对象的实体, User, Car, Person等等)
    Attributes:实体对象属性
    ReaationShips:关系
    Fetched Properties:

    >_<
    多表关联内容可以看看: http://www.jianshu.com/p/e9f3b5e0cd19

    二. 创建实体管理

    右键添加一个Core data -> NSManagedObject subclass, 一直选择, 选中Car, Wheel. 到最后会实现


    QQ20151206-1.png

    三. 导入AppDelegate.h头文件, 开始管理数据库

     主要操作:
    //先取出coredata上下文管理者***
    AppDelegate \*appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = appDelegate.managedObjectContext;
    
    //1.保存新数据***
    Car \*car = [NSEntityDescription insertNewObjectForEntityForName: @"Car" inManagedObjectContext: context];***
    car.carName = label1.text;
    car.carType = label2.text;
    [appDelegate saveContext];
    
    //2.查询数据
    NSError \*error;
    NSFetchRequest \*request = [NSFetchRequest new];
    NSEntityDescription \*entity = [NSEntityDescription entityForName: @"Car" inManagedObjectContext: context];
    [request setEntity: entity];
     NSPredicate \*predicate = [NSPredicate predicateWithFormat:@"carName=%@", carName];
    [request setPredicate:predicate];***
    NSArray \*results = [[context executeFetchRequest: request error: &error] copy];
    for (Car \*car in results) {
     NSLog(@"%@", car.carName);
    }
    
    //3.更新数据
    {
    NSFetchRequest\* request=[[NSFetchRequest alloc] init];
    NSEntityDescription \*car=NSEntityDescription entityForName:@"car" inManagedObjectContext:_myAppDelegate.managedObjectContext];  
    [request setEntity:car];
    ///查询条件
    NSPredicate\* predicate=[NSPredicate predicateWithFormat:@"carName==%@",@"name"];
     [request setPredicate:predicate];
    NSError\* error=nil;
    NSMutableArray\* mutableFetchResult=[[_myAppDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
    if (mutableFetchResult==nil) {
     NSLog(@"Error:%@",error); 
    }
    NSLog(@"The count of entry: %i",[mutableFetchResult count]);  
     for (Car\* car in mutableFetchResult) {  
     car.carName = @"name1"  ;
        ...    
    } 
    
    //更新后要进行保存,否则没更新  
    [_myAppDelegate.managedObjectContext save:&error];
    }
    
    //4.删除数据***
    {
    NSFetchRequest\* request=[[NSFetchRequest alloc] init];  
        NSEntityDescription\* car=[NSEntityDescription entityForName:@"Car" inManagedObjectContext:_myAppDelegate.managedObjectContext];  
        [request setEntity:car];  
        NSPredicate\* predicate=[NSPredicate predicateWithFormat:@"carName==%@",@"name"];  
        [request setPredicate:predicate];  
        NSError\* error=nil;  
        NSMutableArray\* mutableFetchResult=[[_myAppDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];  
        if (mutableFetchResult==nil) {  
      NSLog(@"Error:%@",error);  
        }  
        NSLog(@"The count of entry: %i",[mutableFetchResult count]);  
        for (Car \*car in mutableFetchResult) {  
       [_myAppDelegate.managedObjectContext deleteObject:car];  
        }  
        if ([_myAppDelegate.managedObjectContext save:&error]) {  
     NSLog(@"Error:%@,%@",error,[error userInfo]);  
     }  
    }
    
    
    
    

    2.NSFetchRequest 常用方法 -setEntity:

    设置你要查询的数据对象的类型(Entity)

    • -setPredicate:
      设置查询条件
    • -setFetchLimit:
      设置最大查询对象数目
    • -setSortDescriptors:
      设置查询结果的排序方法
    • -setAffectedStores:
      设置可以在哪些数据存储中查询
      [request setFetchBatchSize:500];//从数据库里每次加载500条数据来筛选数据
      [request setFetchOffset:sizeCount];//读取数据库的游标偏移量,从游标开始读取数据
      sizeCount = 10;
      [request setFetchLimit:10];//每次要取多少条数据,10就是每次从数据库读取10条数据
      NSPredicate用于查询和过滤
      在SQL中作为查询条件通常用WHERE,但在COREDATA中作为查询条件就可以用到NSPredicate.
      NSPredicate 不单可以和COREDATA中的FetchRequest 配合使用。也可以与NSArray配合使用
      一个线程用一个NSManagedObjectContext对象.
      使用coredata 在项目中建立表,它会自己来生成数据库,而在每个表中都有它自己生成的Z_PK,Z_ENT,Z_OPT 这三个字段,
      Z_PK 表的主键,从1开始递增, 具有唯一性
      可以通过主键访问和获取对象的途径:

    NSFetchRequest* request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];
    [request setResultType:NSManagedObjectIDResultType];
    [request setFetchBatchSize:20];
    NSError* error = nil;
    NSArray* items = [context executeFetchRequest:request error:&error];
    for (NSManagedObjectID* objectID in items) {
     NSManagedObject* object = [context objectWithID:objectID];
    ...
    }

    Z_ENT 表在xcdatamodel 中的索引值,如果有6个表那么它的值的区间就是[1,6 ]
    Z_OPT 表示的是每条数据被操作的次数,初始化值为1,只要是增删改查都会加1

    3.其他记录

    方便查阅

    1. 通过core data存储任意类型的数据:http://blog.csdn.net/likendsl/article/details/8549333
    2. 多表关联时, 动态设置删除关系.:http://blog.csdn.net/fengsh998/article/details/8090111
    3. 批量操作、聚合操作、WWDC 2015新特性: http://www.cocoachina.com/ios/20150730/12785.html

    4.问题记录

    当查询返回数据是fault时, 可以加上这句试试:
    [request setReturnsObjectsAsFaults:NO];

    学习记录, 如有错误, 敬请指出, 谢谢

    相关文章

      网友评论

        本文标题:Core data 使用学习整理(快速上手)

        本文链接:https://www.haomeiwen.com/subject/jmhshttx.html