iOS进阶学习-CoreData

一、CoreData数据库框架的优势

  1、CoreData数据持久化框架是Cocoa API的一部分,首次在iOS5版本的系统中出现,它允许按照实体-属性-值模型组织数据,并以XML、二进制文件或者SQLite数据文件的格式持久化数据。CoreData主要提供独享-关系映射(ORM)功能,把OC对象转化为数据保存到文件,也可以数据转化为OC对象。

  2、CoreData数据库框架的优势:

  • sqlite:
  • 基于C接口需要使用sql语句,代码繁琐。
  • 在处理大量数据时,表关系更直观。
  • 在OC中不是可视化的。
  • CoreData:
  • 可视化,有undo/redo能力
  • 可以实现多种文件格式NSSQLiteStoreType、NSBinaryStoreType、NSInMemoryStoreType、NSXMLStoreType
  • 苹果官方API支持,与iOS结合更紧密。

二、CoreData数据库框架的核心对象

  1、持久化存储和存储文件

  • NSPersistentStore:持久化存储,是对实际文件的一种Object-C表示方式,一个被封装好的底层类,用于存储数据。
  • 存储文件:用来存储和管理数据的文件,iOS支持4种存储类型。

  2、被管理对象上下文

  • NSManagedObjectContext:被管理对象上下文CoreData中用于操作和使用数据,负责应用和数据库之间的交互。
  • 数据的保存需要NSManagedObjectContext进行save操作。
  • 数据的查询需要NSManagedObjectContext进行executeFetchRequest操作(返回值是数组)CoreData提供的是对象关系映射,NSManagedObjectContext操作的都是NSManagedObject对象。

  3、被管理对象相关类

  • NSManagedObjectMode:被管理对象模型,管理多个对象。
  • NSManagedObject:被管理对象,CoreData返回的数据模型,被管理的对象是根据实体描述生成的。
  • NSEntityDescription:实体描述类,根据实体创建被管理对象。
  • Entity:实体类,实体是对文件数据的描述。被管理对象表示实体,实体包含名称,属性(字段)和关系,实体的名称通常和被管理对象名一致。

  4、数据查询

  • NSFetchRequest:查询请求,可以做排序操作,也可以使用谓词。
  • NSManagedObjectContext根据NSFetchRequest查询数据,以数组形式返回,数组中包含被管理对象(NSManagedObject)。
  • NSSortDescriptor:排序操作。

三、CoreData数据库的简单操作

  • 创建实体类与属性
  • 切换可视化关系图
  • CoreData上下文的创建
@interface ViewController ()
// 声明属性(管理对象上下文,sqlite中是声明一个存储路径的属性)
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;

@end

@implementation ViewController
// 懒加载
- (NSManagedObjectContext *)managedObjectContext
{
    // 因为在AppDelegaate中已经实现过了,所以在这里从AppDelegate中去获取
    if (_managedObjectContext == nil) {
        // 获取AppDelegate对象,用系统的单例方法创建
        AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
        _managedObjectContext = appDelegate.managedObjectContext;
    }
    return _managedObjectContext;
}
  • 系统封装好的CoreData方法
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

- (NSURL *)applicationDocumentsDirectory {
    // 打印CoreData的存储路径(sqlite的dbPath字符串路径)URL类型
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
#pragma mark - 获取管理对象
- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"UISenior_4_1CoreData" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}
#pragma mark - 数据库持久化协调器
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"UISenior_4_1CoreData.sqlite"];
    NSError *error = nil;
    NSString *failureReason = @"There was an error creating or loading the application‘s saved data.";
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        // Report any error we got.
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application‘s saved data";
        dict[NSLocalizedFailureReasonErrorKey] = failureReason;
        dict[NSUnderlyingErrorKey] = error;
        error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}

#pragma mark - 获取数据库上下文
- (NSManagedObjectContext *)managedObjectContext {

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

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (!coordinator) {
        return nil;
    }
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    return _managedObjectContext;
}
  • 添加数据
#pragma mark - 添加数据
- (void)addPerson
{
    // 添加的步骤
    // 1.创建person实体对象,然后告诉managedObjectContext,让他做好准备,将这个对象添加到数据库中
    Person *per = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
    // 2.给对象属性赋值
    per.personName = @"MBBoy";
    per.personGender = @"Unknow";
    per.personAge = @10;
    // 3.将per对象存入数据库
    BOOL result = [_managedObjectContext save:nil];
    // 4.判断是否插入成功
    if (result) {
        NSLog(@"添加数据成功");
    }else {
        NSLog(@"添加数据失败");
    }

}
  • 更改数据
#pragma mark - 更改数据
- (void)updatePerson
{
    // 1.实例化查询请求类
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
    // 2.设置查询条件
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"personName = ‘MBBoy‘"];
    // 3.由context根据更新条件的请求去具体进行更新操作
    NSArray *resultArray = [_managedObjectContext executeFetchRequest:fetchRequest error:nil];
    // 4.遍历搜索出来的结果
    for (Person *per in resultArray) {
        per.personName = @"Root";
        per.personGender = @"animal";
        per.personAge = @89;
    }
    BOOL result = [_managedObjectContext save:nil];
    // 6.判断结果
    if (result) {
        NSLog(@"更新数据成功");
    }else {
        NSLog(@"更新数据失败");
    }
}
  • 删除数据
#pragma mark - 删除数据
- (void)deletePerson
{
    // 1.实体化请求类(查询)
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
    // 2.找到删除的条件(根据什么进行删除)(NSPredicate)
    request.predicate = [NSPredicate predicateWithFormat:@"personName = ‘MBBoy‘"];
    // 3.由context根据删除条件的请求去具体进行删除操作
    NSArray *resultArray = [_managedObjectContext executeFetchRequest:request error:nil];
    // 4.遍历搜索出来的结果
    for (Person *per in resultArray) {
        // 删除查询到的相关的人
        [_managedObjectContext deleteObject:per];
    }
    // 5.进行删除结果的判断
    BOOL result = [_managedObjectContext save:nil];
    // 6.判断结果
    if (result) {
        NSLog(@"删除数据成功");
    }else {
        NSLog(@"删除数据失败");
    }
}
  • 查询数据
#pragma mark - 查询相关信息
- (void)selectAllPerson
{
    // 1.实例化查询请求
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"personName LIKE ‘*R*‘"];
    request.predicate = predicate;
    NSArray *resultArray = [_managedObjectContext executeFetchRequest:request error:nil];
    for (Person *per in resultArray) {
        NSLog(@"name = %@, gender = %@, age = %@", per.personName, per.personGender, per.personAge);
    }

}

四、CoreData数据库表关联操作

  • 添加表关系

五、CoreData数据库数据的迁移

  • CoreData支持随着App开发演进而带来的对象模型升级或修改的管理。模型的改变将导致不兼容(或不能打开)以前版本创建的存储。如果你要改变你的模型,你就必须要改变现有存储中的数据-即数据存储格式(storeformat)——即数据迁移(migration)
  • 数据迁移的三个阶段:
  • 创建基于源实例对象的目标实例对象;
  • 重新建立联系;
  • 验证与保存。
  • 版本迁移操作图:
时间: 2024-10-11 04:27:47

iOS进阶学习-CoreData的相关文章

iOS进阶学习-地图

一.地图的简介 在移动互联网时代,移动app能解决用户的很多生活琐事,比如: 导航:去任意陌生的地方. 周边:找餐馆.找酒店.找银行.找电影院. 手机软件:微信摇一摇.QQ附近的人.微博.支付宝等. 在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这两大功能,必须基于两个框架进行开发: Map Kit :用于地图展示. Core Location :用于地理定位. 二.地图定位(CoreLocation框架,地理编码与反地理编码) 1.CoreLocation框架的使用 导入头文件

iOS进阶学习-多线程

一.多线程概述 1.程序,进程,线程 程序:由源代码生成的可执行应用.(例如:QQ.app) 进程:一个正在运行的程序可以看做一个进程.(例如:正在运行的QQ就是一个进程),进程拥有独立运行所需的全部资源. 线程:程序中独立运行的代码段.(例如:接收QQ消息的代码) 一个进程是由一或多个线程组成.进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行. 2.单线程 每个正在运行的程序(即进程),至少包含一个线程,这个线程叫主线程. 主线程在程序启动时被创建,用于执行main函数.

iOS进阶学习笔记

熟练掌握C/C++/Objective-C/Swift语言: 熟悉Cocoa Touch(Foundation,UIKit).Objective-C中block,gcd,NSOperation等: 熟悉Object消息传递等机制,Objective-C Runtime,阅读源码: 熟练使用大部分iOS平台常用库,开源库(AFNetworking,SDWebImage,fmdb),开源控件(EGOTableViewPullRefresh,MRProgress); 关注github上iOS平台开源项

iOS进阶学习-CocoaPods的安装与使用

一.CocoaPods的安装 1.简介: CocoaPods是一个用来帮助我们管理第三方依赖库的工具. 在开发iOS应用时,会经常使用第三方类库,比如SDWebImage.AFNetworking等等,手动的下载与添加类库非常麻烦,通过CocoaPods可以便捷的下载与管理第三方类库. 使用CocoaPods的目的是让我们能自动化的.集中的.直观的管理第三方开源库. 官方链接:https://cocoapods.org 2.安装步骤 第一步:打开终端,查看自己电脑的ruby环境:gem sour

iOS进阶学习-即时通讯(2)

本篇是续接即时通讯(1). 一.好友列表 管理好友列表是通过XMPP中的花名册(XMPPRoster).代码示例: #pragma mark - 管理好友 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *rosterStorage = [XMPPRosterCoreDataStorage sharedInstance]; // 给roster属性进行初始化 self.xmppRoster = [[XMPPRoster alloc] initWithRoster

iOS进阶学习-网络之数据请求

注:文中出现的网站只做用例子,所以有些已经失效的网站,具体URL大家可以自己上网搜索相关资源. 一.HTTP和HTTPS协议 1.URL: URL全称是Uniform Resource Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址.位置,互联网上的每个资源都有一个唯一的URL URL的基本格式=协议://主机地址/路径 http://www.cnblogs.com/soley 协议:不同的协议,代表着不同的资源查找方式,资源传输方式 主机地址

iOS进阶学习-数据处理之文件读写

一.沙盒机制 1.什么是沙盒? 每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立.封闭.安全的空间,叫做沙盒. 2.沙盒机制(SandBox) 沙盒是一种安全体系. 它规定了应用程序只能在为该应用程序创建的文件夹(沙盒)内访问文件,不可以访问其它沙盒内的内容(iOS8之后已经部分开放访问). 所有的非代码文件都保存在这个地方,比如图片.声音.属性列表(plist).sqlite数据库和文本文件等. 3.沙盒机制的特点: 每个应用程序的活动范围都限定在自己的沙盒里. 不能随意

iOS进阶学习-数据库

一.数据库管理系统 1.SQL语言概述:SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 2.常见的数据库: MySQL:MySQL是一个精巧的SQL数据库管理系统,而且是开源的数据管理系统.MySQL主要目标是快速.健壮和易用.它拥有强大的功能.灵活性.丰富的应用编程接口(API)以及精巧的系统结构. Oracle:Oracle Database,又名Oracle RDBMS,或简称Oracl

iOS进阶学习-初识AFNetworking

一.AFNetworking简介 AFNetworking是一个 在iOS开发中 使用非常多网络开源库 适用于iOS以及Mac OS X.它构建于在(Apple iOS开发文档) NSURLConnection ,  NSOperation , 以及其他熟悉的Foundation技术之上. 它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松. 官方链接http://cocoadocs.org/docsets/AFNetworking/1.3.0/. AFNetworking