coredata 学习总结(二)

这一篇幅主要是针对当前项目和常用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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值