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