首页 > 代码库 > 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总结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。