首页 > 代码库 > CoreData总结

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

 

 

 

CoreData总结