如果对你有帮助或者你很喜欢的话请star,感谢支持
这里主要是讲如何使用系统自带的 CoreData 类对数据持久化到本地的操作,对于初学者十分适合使用,作为作者的我,将所有必要的注释全部写的清楚明了,使得 ios 开发人员在参考此文档时既有 demo 又有解释,实现快速上手.
- 插入数据/增加数据
/* 增 */ - (void)addAction { Test *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Test" inManagedObjectContext:self.app_delegate.managedObjectContext]; UserInfoModel *model = [[UserInfoModel alloc]init];{ model.age = arc4random_uniform(100); model.sex = arc4random_uniform(2); model.address = @"江苏省南京市江宁区将军大道十字路口"; } obj.score = @(arc4random_uniform(100)); obj.username = @"将军大道"; obj.userinfo = model; [self.app_delegate saveContext]; //! < 持久化到本地 }
- 删除数据
/* 删 */ - (void)deleteAction{ NSFetchRequest *req = [[NSFetchRequest alloc]initWithEntityName:@"Test"]; NSArray *objs = [self.app_delegate.managedObjectContext executeFetchRequest:req error:nil]; if (objs.count == 0) { NSLog(@"删除失败 --> 无数据"); return; } Test *obj = [objs objectAtIndex:arc4random_uniform((u_int32_t)objs.count)]; [self.app_delegate.managedObjectContext deleteObject:obj]; //! < 删除对象 NSLog(@"删除成功"); [self.app_delegate saveContext]; //! < 持久化到本地 }
- 修改数据
/* 改 */ - (void)changeAction{ NSFetchRequest *req = [[NSFetchRequest alloc]initWithEntityName:@"Test"]; NSArray *objs = [self.app_delegate.managedObjectContext executeFetchRequest:req error:nil]; if (objs.count == 0) { NSLog(@"修改失败 ---> 无数据"); return; } Test *obj = [objs objectAtIndex:arc4random_uniform((u_int32_t)objs.count)]; obj.username = @"修改数据"; //! < 拿到数据对象后直接赋值操作并保存即可 UserInfoModel *mod = [obj.userinfo copy]; mod.address = @"南京市鼓楼区鼓楼地铁站🚇"; obj.userinfo = mod; NSLog(@"修改成功"); [self.app_delegate saveContext]; //! < 持久化到本地 }
- 查找数据(可以条件查找)
/* 查 */ - (void)getAction{ #warning 对于模型中的数据, NSFetchRequest 并不能对模型中属性值实现过滤操作,但是可以对模型外的数据进行处理 NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"Test"]; NSSortDescriptor *desc = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO]; //! < 实现查找的数据降序排列(NO,YES 为升序) NSPredicate *predicate = [NSPredicate predicateWithFormat:@"score < %ld", 60]; //! < 将分数小于60的查找出来 req.predicate = predicate; /* // 分页用到 查找的数量与偏移量 req.fetchLimit = 5; //! < 数量 | 结论:无论查找的数量设置多少,NSFetchRequest // | ---> 都会遍历所有数据,并且按照事先约定的条件进行 req.fetchOffset = req.fetchLimit * (curPage - 1); //! < 偏移量 | 处理后输出 NSLog(@"**********************第%ld页*************************",curPage); */ req.sortDescriptors = @[desc]; NSArray *array = [self.app_delegate.managedObjectContext executeFetchRequest:req error:nil]; #pragma 模型内的数据可以采用数组的条件过滤操作,然而当进行此步骤操作时,分页效果将完全乱了 NSPredicate *array_predicate = [NSPredicate predicateWithFormat:@"userinfo.age < %ld",20]; array = [array filteredArrayUsingPredicate:array_predicate]; if (array.count == 0) { NSLog(@"**********************无数据*************************"); return; } curPage ++; for (Test *obj in array) { UserInfoModel *model = obj.userinfo; NSLog(@"%@ | %02ld | %02ld | %@ | %@",obj.username,model.age,[obj.score integerValue],model.sex?@"男":@"女",model.address); } }
- NSManagedObjectContext 初始化
if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (!coordinator) { return nil; } _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; //这里需要指定协作器,就是连接对象上下文和模型的桥梁 return _managedObjectContext;
- NSManagedObjectModel 初始化
if (_managedObjectModel != nil) { return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"文件名" withExtension:@"momd"]; //这里的`文件名`就是在资源文件中生成的`***.xcdatamodeld `文件名,后缀在 url 中必须为 momd,(其实是个文件夹里面的文件,可以输出地址查看) _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; //指定模型地址 return _managedObjectModel;
- NSPersistentStoreCoordinator 初始化
if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; NSURL *applicationDocumentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"文件名.sqlite"]; //这里是指定数据库存储的地方和名字-->文件名 [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:nil]; //添加数据库的路径 return _persistentStoreCoordinator;
- 例如(实现部分)
- (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:[NSNumber numberWithInteger:self.age] forKey:@"age"]; [aCoder encodeObject:[NSNumber numberWithBool:self.sex] forKey:@"sex"]; [aCoder encodeObject:self.address forKey:@"address"]; } - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{ self = [super init]; if (self) { self.age = [[aDecoder decodeObjectForKey:@"age"] integerValue]; self.sex = [[aDecoder decodeObjectForKey:@"sex"] boolValue]; self.address = [aDecoder decodeObjectForKey:@"address"]; } return self; }
- 例如(实现部分)
- (id)copyWithZone:(nullable NSZone *)zone{ UserInfoModel *model = [[UserInfoModel allocWithZone:zone]init]; model.address = self.address; model.sex = self.sex; model.age = self.age; return model; }