这一篇幅主要是针对当前项目和常用case编写的工具类,直接上代码
代码结构:
CoreDataManager
//
// CoreDataManager.h
// CoreDataDemo
//
//
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "Department+CoreDataClass.h"
#import "Employee+CoreDataClass.h"
@interface CoreDataManager : NSObject
+ (CoreDataManager *)defaultManager;
/**
* 插入单条数据到Entity
*
* @param entity 实体字典,可应用于没有多表查询关系的情况
* @param name Entity名称
*/
- (BOOL)insertCoreDataWithEntity:(NSDictionary *)entity name:(NSString *)name;
/**
* 根据查询条件从实体中查询数据
*
* @param name Entity名称
* @param predicate 查询条件
*
* @return 字典数组
*/
- (NSMutableArray *)selectCoreDataFromName:(NSString *)name predicate:(NSPredicate *)predicate;
/**
* 根据查询条件从实体中查询数据
*
* @param name Entity名称
* @param predicate 查询条件
*
* @return 字典数组,返回fetchrequest的原始数据
*/
- (NSArray *)getFetchRequestResultFromeName:(NSString *)name predicate:(NSPredicate *)predicate;
/**
* 更新单条数据到Entity
*
* @param entity 更新内容
* @param name Entity名字
* @param predicate 更新条件
*
* @return 是否更新成功
*/
- (BOOL)updateCoreDataWithEntity:(NSDictionary *)entity name:(NSString *)name predicate:(NSString *)predicate;
/**
* 从Entity中删除数据
*
* @param name Entity名字
* @param predicate 更新条件
*
* @return 是否删除成功
*/
- (BOOL)deleteCoreDataWithName:(NSString *)name predicate:(NSPredicate *)predicate;
/**
* 保存到Context
*
*
* @return 是否保存成功
*/
- (BOOL)saveContext;
/**
* 获取全局的Context
*
*
* @return 是否保存成功
*/
- (NSManagedObjectContext *)getContext;
/**
* 根据搜索条件创建fetch request
*
*
* @return 返回fetch request结果
*/
- (NSFetchRequest *)getFetchRequestWithPredicates:(NSPredicate *)predicate andEntity:(NSString *)name;
/**
* 根据搜索条件和排序规则创建fetch request
*
*
* @return 返回fetch request结果
*/
- (NSFetchRequest *)getFetchRequestWithPredicates:(NSPredicate *)predicate andEntity:(NSString *)name andSortDescriptors:(NSArray *)sortDescriptors;
@end
//
// CoreDataManager.m
// CoreDataDemo
//
#import "CoreDataManager.h"
@interface CoreDataManager ()
/**
* 负责应用和数据直接的交互CRUD
*/
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
/**
* 添加持久化存储库(比如SQLite数据库)
*/
@property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
/**
* 代表CoreData模型文件
*/
@property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@end
@implementation CoreDataManager
#pragma mark - 单例
+ (CoreDataManager *)defaultManager {
static dispatch_once_t predicate;
static CoreDataManager * defaultManager;
dispatch_once(&predicate, ^{
defaultManager=[[CoreDataManager alloc] init];
});
return defaultManager;
}
#pragma mark - public method
/**
* 插入单条数据到Entity
*
* @param entity 实体字典
* @param name Entity名称
*/
- (BOOL)insertCoreDataWithEntity:(NSDictionary *)entity name:(NSString *)name {
NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:self.managedObjectContext];
[object setValuesForKeysWithDictionary:entity];
// 利用上下文对象,将数据同步到持久化存储库
NSError *error = nil;
BOOL success = [self.managedObjectContext save:&error];
if (!success) {
NSLog(@"保存数据到数据库错误:%@",[error localizedDescription]);
return NO;
}
return YES;
}
/**
* 根据查询条件从实体中查询数据
*
* @param predicate 查询条件
*
* @return 字典数组
*/
- (NSMutableArray *)selectCoreDataFromName:(NSString *)name predicate:(NSPredicate *)predicate {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:self.managedObjectContext];
request.entity = entity;
if (predicate) {
request.predicate = predicate;
}
NSError *error;
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:request error:&error];
NSMutableArray *resultArray = [NSMutableArray array];
for (NSManagedObject *object in fetchedObjects) {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (NSPropertyDescription *property in entity.properties) {
NSString *key = property.name;
id value = [object valueForKey:key];
[dict setValue:value forKey:key];
}
[resultArray addObject:dict];
}
return resultArray;
}
/**
* 根据查询条件从实体中查询数据
*
* @param name Entity名称
* @param predicate 查询条件
*
* @return 字典数组,返回fetchrequest的原始数据
*/
- (NSArray *)getFetchRequestResultFromeName:(NSString *)name predicate:(NSPredicate *)predicate {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:self.managedObjectContext];
request.entity = entity;
if (predicate) {
request.predicate = predicate;
}
NSError *error;
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:request error:&error];
return fetchedObjects;
}
/**
* 更新单条数据到Entity
*
* @param entity 更新内容
* @param name Entity名字
* @param predicate 更新条件
*
* @return 是否更新成功
*/
- (BOOL)updateCoreDataWithEntity:(NSDictionary *)entity name:(NSString *)name predicate:(NSString *)predicate {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:name inManagedObjectContext:self.managedObjectContext];
request.entity = entityDescription;
if (predicate) {
NSPredicate *predicateObject = [NSPredicate predicateWithFormat:predicate];
request.predicate = predicateObject;
}
NSError *error;
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:request error:&error];
for (NSManagedObject *object in fetchedObjects) {
[object setValuesForKeysWithDictionary:entity];
}
BOOL success = [self.managedObjectContext save:&error];
if (!success) {
NSLog(@"更新数据到数据库错误:%@",[error localizedDescription]);
return NO;
}
return YES;
}
/**
* 从Entity中删除数据
*
* @param name Entity名字
* @param predicate 更新条件
*
* @return 是否删除成功
*/
- (BOOL)deleteCoreDataWithName:(NSString *)name predicate:(NSPredicate *)predicate {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSPredicate *fetchPredicate = predicate;
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:name inManagedObjectContext:self.managedObjectContext];
request.entity = entityDescription;
if (fetchPredicate) {
request.predicate = fetchPredicate;
}
NSError *error;
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:request error:&error];
for (NSManagedObject *object in fetchedObjects) {
[self.managedObjectContext deleteObject:object];
}
BOOL success = [self.managedObjectContext save:&error];
if (!success) {
NSLog(@"删除数据出错:error:%@",error);
return NO;
}
return YES;
}
#pragma mark - private method
//获取Documents路径
- (NSURL *)applicationDocumentsDirectory {
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
- (NSString *)bundleName {
return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
}
#pragma mark - getter setter
- (NSManagedObjectContext *)managedObjectContext {
if (_managedObjectContext == nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_managedObjectContext.persistentStoreCoordinator = [self persistentStoreCoordinator];
}
return _managedObjectContext;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator == nil) {
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[self bundleName]];
NSError *error = nil;
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
return _persistentStoreCoordinator;
}
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel == nil) {
// 数据模型的 URL
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataDemo" withExtension:@"momd"];
// 从 Bundle 加载对象模型
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
//_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
}
return _managedObjectModel;
}
/**
* 保存到Context
*
*
* @return 是否保存成功
*/
- (BOOL)saveContext {
// 判断上下文是否为 nil
if (self.managedObjectContext == nil) {
NSLog(@"上下文为nil,无法进行数据操作");
return NO;
}
NSError *error = nil;
if (self.managedObjectContext.hasChanges && ![self.managedObjectContext save:&error]) {
NSLog(@"没有需要保存的数据");
return NO;
}
[self.managedObjectContext save:NULL];
return YES;
}
/**
* 获取全局的Context
*
*
* @return 是否保存成功
*/
- (NSManagedObjectContext *)getContext {
return self.managedObjectContext;
}
/**
* 根据搜索条件创建fetch request
*
*
* @return 返回fetch request结果
*/
- (NSFetchRequest *)getFetchRequestWithPredicates:(NSPredicate *)predicate andEntity:(NSString *)name {
NSString *entityName = name;
NSPredicate *requestPredicate = predicate;
NSFetchRequest *fetchRequst = nil;
if (entityName.length == 0) {
return nil;
}
//设置entity
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:name inManagedObjectContext:self.managedObjectContext];
request.entity = entityDescription;
//设置查询条件
if (requestPredicate) {
[request setPredicate:requestPredicate];
}
return fetchRequst;
}
/**
* 根据搜索条件和排序规则创建fetch request
*
*
* @return 返回fetch request结果
*/
- (NSFetchRequest *)getFetchRequestWithPredicates:(NSPredicate *)predicate andEntity:(NSString *)name andSortDescriptors:(NSArray *)sortDescriptors {
NSString *entityName = name;
NSPredicate *requestPredicate = predicate;
NSFetchRequest *fetchRequst = nil;
if (entityName.length == 0) {
return nil;
}
//设置entity
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:name inManagedObjectContext:self.managedObjectContext];
request.entity = entityDescription;
//设置查询条件
if (requestPredicate != NULL && [requestPredicate isKindOfClass:[NSPredicate class]]) {
[request setPredicate:requestPredicate];
}
//设置排序规则
if (sortDescriptors != NULL && [sortDescriptors count] > 0) {
[fetchRequst setSortDescriptors:sortDescriptors];
}
return fetchRequst;
}
@end
ViewController
#import "ViewController.h"
#import "CoreDataManager.h"
#import "Employee+CoreDataClass.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextView *textView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)getButtonSelected:(id)sender {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstName == %@" argumentArray: @[@"firstName"]];
NSMutableArray *array = [[CoreDataManager defaultManager] selectCoreDataFromName:@"Employee" predicate:predicate];
NSMutableString *textString = [NSMutableString string];
if (array != NULL && [array count] > 0) {
for (NSDictionary *dic in array) {
[textString appendString:[dic valueForKey:@"firstName"]];
[textString appendString:[dic valueForKey:@"lastName"]];
[textString appendString:@"\n"];
}
}
self.textView.text = textString;
}
- (IBAction)getMultipleButtonSelected:(id)sender {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"city == %@" argumentArray: @[@"城市"]];
NSArray *array = [[CoreDataManager defaultManager] getFetchRequestResultFromeName:@"Department" predicate:predicate];
NSMutableString *textString = [NSMutableString string];
if (array != NULL && [array count] > 0) {
for (Department *obj in array) {
Employee *employee = obj.employee;
[textString appendString:employee.firstName];
[textString appendString:employee.lastName];
[textString appendString:@"\n"];
}
}
self.textView.text = textString;
}
- (IBAction)insertButtonSelected:(id)sender {
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setValue:@"firstName" forKey:@"firstName"];
[dic setValue:@"lastName" forKey:@"lastName"];
if ([[CoreDataManager defaultManager] insertCoreDataWithEntity:dic name:@"Employee"] == YES) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"插入成功" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
}
}
- (IBAction)updateButtonSelected:(id)sender {
}
- (IBAction)deleteMultipleButtonSelected:(id)sender {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"city == %@" argumentArray: @[@"西安"]];
if ([[CoreDataManager defaultManager] deleteCoreDataWithName:@"Department" predicate:predicate]) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"删除成功" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
}
}
- (IBAction)deleteButtonSelected:(id)sender {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstName == %@" argumentArray: @[@"lisa"]];
if ([[CoreDataManager defaultManager] deleteCoreDataWithName:@"Employee" predicate:predicate]) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"删除成功" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
}
}
- (IBAction)multipleInsert:(id)sender {
for (int index = 0; index < 10; index ++) {
//多表查询,表和表之间有关联关系的时候,需要在外部处理好数据,再进行save
Department *department = [NSEntityDescription insertNewObjectForEntityForName:@"Department" inManagedObjectContext:[[CoreDataManager defaultManager] getContext]];
department.city = @"城市";
department.street = @"街道";
department.state = @"中国";
//获得关联表employee
Employee *employee = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:[[CoreDataManager defaultManager] getContext]];
employee.firstName = @"firstName";
employee.lastName = @"lastName";
employee.birthday = @"birthday";
department.employee = employee;
[[CoreDataManager defaultManager] saveContext];
}
}
@end