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);
        }
    }
    
}

 

原文地址:https://www.cnblogs.com/beijingxiaoguo/p/4158088.html