• CoreData总结


    Core Data,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架

     

    //参与对数据操作的全过程,监测数据对象的变化,以提供对undo/redo的支持及更新绑定到数据额UI
    
    @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
    
    //用来描述应用程序的数据模型,包含实体,特性,读取请求
    
    @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
    
    //相当于数据文件管理器,处理底层的对文件的读取和写入,一般无需跟他打交道
    
    @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

     1.应用程序先创建或者读取模型文件,生成NSManagedObjectModel对象

    2. NSManagedObjectContext调用NSPersistentStoreCoordinator对数据文件进行读写

    3. NSPersistentStoreCoordinator负责从数据文件中读取,生成ManagedObject,或者保存ManagedObject对象

    4. NSManagedObjectContext参与对数据各种操作的整个过程

    5.各种Controller,用来可视化的操作数据库对象

     

    打开数据库的封装方法 

     

    /**
     *  打开数据库
     */
    - (void)openDB
    {
        //创建数据库
        //1.将所有的实例化模型(将所有的数据模型全部加进来)
        NSManagedObjectModel * model = [NSManagedObjectModel mergedModelFromBundles:nil];
        //单个添加
    //        NSURL * url = [[NSBundle mainBundle] URLForResource:@"CoreDataHandle" withExtension:@"momd"];
    //        NSManagedObjectModel * model2 = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
        
        //2.实例化存储调度,建立起桥梁,需要模型
        NSPersistentStoreCoordinator * store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
        
        //3.添加一个持久化的数据库到存储调度
        //3.1 建立数据保存的沙盒路径所对应的URL
        NSString * path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"my.sqlite"];
        
        NSURL * url = [NSURL fileURLWithPath:path];
        
        //3.2打开数据库,或者新建文件(如果数据库不存在,那么新建文件)
        NSError * error = nil;
        //下面options的两个参数是版本迁移的两个参数
        [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:@{NSMigratePersistentStoresAutomaticallyOption:@YES,NSInferMappingModelAutomaticallyOption:@YES} error:&error];
        if (error) {
            NSLog(@"数据库打开出错:%@",error.localizedDescription);
        }
        else
        {
            NSLog(@"数据库打开成功");
            self.managedObjectContext = [[NSManagedObjectContext alloc] init];
            self.managedObjectContext.persistentStoreCoordinator = store;
        }
        
    }

     

    谓词的使用方法举例

    /**
     *  查询所有用户记录
     */
    - (void)allPersons
    {
        // 1. 实例化一个查询(Fetch)请求
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
        
        // 条件查询,通过谓词来实现的
    //    request.predicate = [NSPredicate predicateWithFormat:@"age < 60 && name LIKE '*五'"];
        // 在谓词中CONTAINS类似于数据库的 LIKE '%王%'
    //    request.predicate = [NSPredicate predicateWithFormat:@"phoneNo CONTAINS '1'"];
        // 如果要通过key path查询字段,需要使用%K
    //    request.predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS '1'", @"phoneNo"];
        // 直接查询字表中的条件
        
        // 2. 让_context执行查询数据
        NSArray *array = [_context executeFetchRequest:request error:nil];
        
        for (Person *p in array) {
            NSLog(@"%@ %@ %@", p.name, p.age, p.phoneNo);
            
            // 在CoreData中,查询是懒加载的
            // 在CoreData本身的SQL查询中,是不使用JOIN的,不需要外键
            // 这种方式的优点是:内存占用相对较小,但是磁盘读写的频率会较高
            for (Book *b in p.books) {
                NSLog(@"%@ %@ %@", b.name, b.price, b.author);
            }
        }
        
    }

     

  • 相关阅读:
    Robot Framework-取出接口返回的字段
    利用VBA宏批量解决Word中图片大小、居中设置
    封装和继承
    Shiro的学习
    Redis集群搭建
    Mysql主从架构
    idea修改maven的默认配置不生效
    Mybatis笔记
    【python】文件的读写方法(r;r+;rb;w;w+;wb;a;a+;ab)
    【Python】Xpath语法&示例
  • 原文地址:https://www.cnblogs.com/beijingxiaoguo/p/4158088.html
Copyright © 2020-2023  润新知