JC专题

iOS coredata Stack 工具类封装技巧

2016-01-18  本文已影响525人  Mr_Candy

提问与回答

苹果系统生成的模板中已经把 Core Data 的基础准备都放在 AppDelegate 中了,为什么还要自己封装?

基础知识了解

操作步骤

新建 coreData工具类
建立单例对象

// 重写init方法

Core Data Stack 相关方法

// 创建一个只读上下文本属性
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@synthesize managedObjectContext = _managedObjectContext;
- (NSManagedObjectContext *)managedObjectContext {
    // 返回已经绑定到`持久化存储调度器`的管理对象上下文
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }
    // 数据模型的 URL
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:modelName withExtension:@"momd"];
    // 从 Bundle 加载对象模型
    NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    // 创建持久化存储调度器
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
    // 指定保存在磁盘的数据库文件 URL
    NSURL *applicationURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    NSURL *storeURL = [applicationURL URLByAppendingPathComponent:dbName];

    if ([psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:NULL] == nil) {
        NSLog(@"创建数据库错误");
        return nil;
    }
    // 创建管理对象上下文,并且指定并发类型
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    // 设置管理上下文的存储调度器
    [_managedObjectContext setPersistentStoreCoordinator:psc];

    return _managedObjectContext;
}

思维导图如下:

- (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.backgroundMoc save:NULL];
    return YES;
}

框架已上传到github: https://github.com/CandyGentleman/coreData.git如有不足之处,欢迎指出!

上一篇 下一篇

猜你喜欢

热点阅读