数据持久化方法——Core Data

本文深入探讨了CoreData技术,从基本概念、核心组件到实际应用,包括模型建立、数据操作、数据存储与管理等关键步骤,并通过代码示例展示了如何使用CoreData在iOS应用中高效地进行数据持久化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述


Core Data是一种用来解决应用中数据持久化问题的技术。作为一个Cocoa框架,首次在Mac OS X 10.4 Tiger与iOS 3.0系统中出现。它允许按照实体-属性-值模型组织数据,并以XML,二进制文件或SQLite数据文件的格式将其串行化。Core Data允许用户使用代表实体和实体间关系的高层对象来操作数据。它也可以管理串行化的数据,提供对象生存期管理与object graph管理,包括存储。Core Data直接与SQLite交互,避免开发者使用原本的SQL语句。
CoreData的核心概念是托管对象。托管对象是由Core Data管理的简单模型对象,但必须是NSManagedObject类或者其子类的实例。托管对象模型包含一些应用程序托管对象实体的描述,描述中包括属性,关系等。

Core Data中常用的类




Core Data 的初步建立

首先导入框架


创建模型编辑器


这里我想建立三个实体,分别是Car,User和Dealer 在创建好实体后再分别添加属性


高亮选择后可以自动创建对应的类文件


然后我们可以从Style模式里看到我们建立的实体的ER图


建立模型对象类

为了方便管理和使用模型对象,我把有关方法统一建立在了CarModel类中

后面涉及到的主要有:
@property (nonatomic, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, readonly) NSManagedObjectContext *managedObjectContext;

- (NSURL *)dataStoreURL;
- (Car *)makeNewCar;
- (NSArray *)carListAfterFetch;

返回数据存储的URL函数

- (NSURL *)dataStoreURL
{
    static NSString *fileName = @"Car.sql";
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];    
    NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    
    return fileURL;
}


数据模型NSManagedObjectModel


- (NSManagedObjectModel *)managedObjectModel
{
    if (_managedObjectModel)
    {
        return _managedObjectModel;
    }
    _managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
    
    return _managedObjectModel;
}

使用持久化存储协调器,链接到数据模型


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator)
    {
        return _persistentStoreCoordinator;
    }
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSError *error;
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                   configuration:nil
                                                             URL:[self dataStoreURL]
                                                         options:nil
                                                           error:&error])
    {
        NSLog(@"Error: %@", error);
    }
    
    return _persistentStoreCoordinator;
}


建立托管对象上下文,记录对象图的所有变化。在一些时候,可以执行抓取数据信息并进行检索等等。


- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext)
    {
        return _managedObjectContext;
    }
    _managedObjectContext = [[NSManagedObjectContext alloc] init];
    [_managedObjectContext setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
    return _managedObjectContext;
}


一个创建汽车实例的方法


- (Car *)makeNewCar
{
    Car *newCar = [NSEntityDescription insertNewObjectForEntityForName:@"Car"
                                                inManagedObjectContext:[self managedObjectContext]];
    return newCar;
}


检索数据方法,返回一个数组储存目前存在的实例的信息


- (NSArray *)carListAfterFetch
{
    NSError *error;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:[self managedObjectContext]];
    fetchRequest.entity = entity;
    
    NSArray *listOfCars = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    
    return listOfCars;
}

测试

在APPDelegate.m里对主要的方法进行了简单的使用

    CarModel *carModel = [[CarModel alloc] init];
    NSManagedObjectContext *carContext = [carModel managedObjectContext];
    
    Car *car1 = [carModel makeNewCar];
    car1.brand = @"BMW";
    car1.type = @"SUV";
    
    [carContext save:nil];
    
    NSArray *listOfCars = [carModel carListAfterFetch];
    
    [listOfCars enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"CarInList[%i] : %@", idx, [obj brand]);
    }];
    
    Car *rollbackCar = [listOfCars objectAtIndex:0];
    rollbackCar.brand = @"AUDI";
    
    if ([carContext hasChanges]) {
        [carContext rollback];
    }
    
    listOfCars = [carModel carListAfterFetch];
    
    [listOfCars enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"CarInList[%i] : %@", idx, [obj brand]);
    }];
    
    [carContext deleteObject:car1];
    [carContext save:nil];
    
    listOfCars = [carModel carListAfterFetch];
    
    if ([listOfCars count] == 0) {
        NSLog(@"NULL");
    }
    else {
        [listOfCars enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSLog(@"CarInList[%i] : %@", idx, [obj brand]);
        }];
    }

打印的结果是
2013-08-01 21:46:14.860 CoreDataTest[721:c07] CarInList[0] : BMW
2013-08-01 21:46:14.862 CoreDataTest[721:c07] CarInList[0] : BMW
2013-08-01 21:46:14.864 CoreDataTest[721:c07] NULL


这里使用了上下文的存储 删除 读取 回文(rollback)方法
Core Data中还有好多高级方法,如redo/undo等(重做,撤销)。

总结


Core Data看起来比使用SQL语句操作数据更快捷和对象化。但是也有很多喜欢写SQL语句的工程师,更偏爱直接操纵数据库。
总结起来Core Data的优点还是很多:
App升级之后数据库字段或者表有更改会导致crash,CoreData的版本管理和数据迁移变得非常有用,手动写sql语句操作还是麻烦一些。
CoreData不光能操纵SQLite,CoreData和iCloud的结合也很好,如果有这方面需求的话优先考虑CoreData。
提供NSFetchedResultsController 类用于管理表视图的数据。即将Core Data的持久化存储显示在表视图中,并对这些数据进行管理:增、删,改。
管理undo/redo操作。
检查托管对象的属性值是否正确。

虽然现在还不能直接设置主键,但是其已经足够强大,也相信以后将会更加便捷。

1. 用户与权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参与安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购与分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:不同角色仅可见对应功能(如学生不可删除设备信息) 2. 实验室与设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 "已报废" 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约与使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室→选择设备→选择时间段→提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材与安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值