实用轮子iOS专题资源__数据库专题iOS学习

Core Data的简单使用

2017-02-26  本文已影响413人  MiracleGl

Core Data允许用户使用代表实体和实体间关系的高层对象来操作数据。它也可以管理序列化的数据,提供对象生存期管理与object graph管理,包括存储。Core Data直接与SQLite交互,避免开发者使用原本的SQL语句。-------维基百科


Core Data 简介

Core Data 快速体验

演练目标
演练步骤
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:UIAlertControllerStyleAlert];

[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    textField.placeholder = @"请输入用户名";
}];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    textField.placeholder = @"请输入年龄";
}];

[alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
[alert addAction:[UIAlertAction actionWithTitle:@"保存" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {

    // ...
}]];

[self presentViewController:alert animated:YES completion:nil];

// 获取上下文
NSManagedObjectContext *moc = self.appDelegate.persistentContainer.viewContext;

// 实例化 Person 对象 - 创建一个实体描述,指定实体名称,要和数据模型行中的实体名称一致
Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:moc];

// 设置 person 的属性
person.name = alert.textFields[0].text;
person.age = alert.textFields[1].text.intValue;

// 保存到数据库
[self.appDelegate saveContext];


    NSManagedObjectContext *moc = self.appDelegate.persistentContainer.viewContext;

// 查询个人记录的请求
NSFetchRequest *request = [Person fetchRequest];

request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];

// 实例化查询控制器
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:nil cacheName:nil];

// 开始查询
[_fetchedResultsController performFetch:NULL];
    

Core Data 架构初探

探究Core Data
实现的步骤

@synthesize persistentContainer = _persistentContainer;

- (NSPersistentContainer *)persistentContainer {

    // 1. 同步所锁,保证线程安全,因为 Core Data 的核心对象都不是线程安全的
    @synchronized (self) {
        if (_persistentContainer == nil) {

            // 0> 将 mainBundle 中的所有数据模型合并成一个 model 对象
            NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

            // 1> 实例化持久化容器,并且指定保存的数据库名称
            _persistentContainer = [[NSPersistentContainer alloc] initWithName:@"com.GL.database" managedObjectModel:model];

            // 2> 同步加载持久化存储,创建数据库
            [_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) {

                if (error != nil) {
                    NSLog(@"加载数据存储失败 %@", error);

                    _persistentContainer = nil;
                }
            }];
        }
    }

    return _persistentContainer;
}


  • 常见的错误原因包括:
    • 目录不存在,无法创建数据库文件,或者禁止写入
    • 由于权限或者设备锁定时的数据保护,不能访问持久化存储
    • 设备存储空间不足
    • 数据库不能被迁移到当前模型版本
@synthesize moc = _moc;

- (NSManagedObjectContext *)moc {

    @synchronized (self) {

        // 1. 实例化管理上下文
        _moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

        // 2. 管理对象模型(实体)
        NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:nil];

        // 3. 持久化存储调度器
        NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];

        // 4. 添加数据库
        /**
         1> 数据存储类型
         3> 保存 SQLite 数据库文件的 URL
         */
        NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
        NSString *path = [cacheDir stringByAppendingPathComponent:@"com.GL.db"];
        // 将本地文件的完整路径转换成 文件 URL
        NSURL *url = [NSURL fileURLWithPath:path];

        [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:NULL];

        // 5. 给管理上下文指定存储调度器
        _moc.persistentStoreCoordinator = psc;
    }

    return _moc;
}


NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption: @(YES),
                       NSInferMappingModelAutomaticallyOption: @(YES)};
[psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:options error:NULL];

if (_moc != nil) {
    return _moc;
}

// 互斥锁,应该锁定的代码尽量少!
@synchronized (self) {

- (void)saveContext {
    NSManagedObjectContext *context = self.moc;

    // 判断上下文中是否有数据发生变化
    // `事务` 可以保存多个数据,不一定每次数据变化都需要保存,例如:for 增加多条记录,就可以最后调用一次保存操作即可!
    if (![context hasChanges]) {
        return;
    }

    // 保存数据
    NSError *error = nil;

    if (![context save:&error]) {
        NSLog(@"保存数据出错 %@, %@", error, error.userInfo);
    }
}



最后感谢大家最近的支持,写下去会更加有动力,请动动你的小手点击赞,再次感谢大家的支持!

上一篇下一篇

猜你喜欢

热点阅读