iOS - CoreData 数据库存储

1、CoreData 数据库

  • CoreData 是 iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据。使用 CoreData 框架,程序员可以很轻松有效地通过面向对象的接口管理数据。CoreData 框架提供了 对象 - 关系映射 (ORM) 的功能,即能够将 OC 对象转化成数据,保存在 SQLite3 数据库文件中,也能够将保存在数据库中的数据还原成 OC 对象,在数据操作过程中,无需编写任何 SQL 语句。

  • 模型文件及实体(Entity)。要使用 CodeData,首先需要定义模型文件,描述应用程序中的所有实体(Entities),所谓实体是跟数据库进行映射的对象。

  • NSManagedObject:对应数据库中的一条记录。

  • CoreData 主要对象关系示意图类似于数据库的句柄,handle,用来操纵数据库 持久化存储调度者,是数据库与对象之间的,在开发中。只会用到一次,如果不理解,直接粘代码。

  • CoreData 主要对象
    • NSManagedObjectContext:负责应用和数据库之间的交互 (CRUD)。
    • NSPersistentStoreCoordinator:添加持久化存储库(如 SQLite 数据库), 是物理数据存储的物理文件和程序之间的联系的桥梁 ,负责管理不同对象上下文。
    • NSManagedObjectModel:被管理的对象模型。
    • NSEntityDescription:实体描述。

2、CoreData 的使用

  • 配置

    • 1、在工程中新建 Data Model 数据模型文件。

    • 2、在 Data Model 模型文件中添加 Entity 实体,修改实体名称,并在实体中添加模型属性。

    • 3、在模型文件右侧属性列表的 Code Generation 中设置生成 NSManagedObject subclass 子类的使用语言。

    • 4、在模型文件右侧属性列表的 Class => Codegen 中设置 Manual/None。如果不修改此项程序编译时会报 Linker command failed with exit code 1 (use -v to see invocation) 错误。

    • 5、基于 Data Model 数据库文件中的 Entity 创建 NSManagedObject subclass 类。Xcode8 从系统菜单的 Editor 创建,创建后文件中多出来 4 个文件。

    • 6、在需要使用 CoreData 的文件中。
          // 引入头文件
          #import "Student+CoreDataClass.h"
      
          // 宏定义实体(数据表)名称
          #define ENTITY_STUDENT    @"Student"
  • 搭建 CoreData 环境
        // 声明目标对象上下文,CoreData 操作数据的环境
        @property (nonatomic, strong) NSManagedObjectContext *moc;
    
        // 托管对象模型文件路径
        NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"TestModel" ofType:@"momd"];
        NSURL *modelUrl = [NSURL fileURLWithPath:modelPath];
    
        // 创建托管对象模型,CoreData 数据模型文件
        NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];
    
        // 创建持久化存储协调器,处理数据的读写
        NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    
        // SQLite 数据库文件路径,CoreData 使用的数据库文件后缀一般写 sqlite
        NSString *sqlPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject
                             stringByAppendingPathComponent:@"student.sqlite"];
        NSURL *sqlUrl = [NSURL fileURLWithPath:sqlPath];
    
        NSLog(@"sqlPath:%@", sqlPath);
    
        // 将 CoreData 文件映射到数据库,并判断操作状态
        NSError *error = nil;
    
        NSPersistentStore *store = [coordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                             configuration:nil URL:sqlUrl options:nil error:&error];
    
        if (!store) {
            NSLog(@"addError = %@", error);
        }
    
        // 创建操作数据的对象
        self.moc = [[NSManagedObjectContext alloc] init];
    
        // 关联持久化存储协调器
        self.moc.persistentStoreCoordinator = coordinator;
  • 插入数据
        // 获取插入到实体的指针
        Student *std = [NSEntityDescription insertNewObjectForEntityForName:ENTITY_STUDENT inManagedObjectContext:self.moc];
    
        // 赋值
        std.name = self.nameTF.text;
        std.age = self.ageTF.text.intValue;
    
        NSError *error = nil;
    
        // 同步到数据库并判断
        if ([self.moc save:&error]) {
    
            [self.myDataArray addObject:std];
            [self.myTableView reloadData];
        } else {
    
            NSLog(@"insert error = %@", error);
        }
  • 删除数据
        // 获取要删除的数据
        Student *std = self.myDataArray[self.selectedRow];
    
        // 从实体中删除
        [self.moc deleteObject:std];
    
        NSError *error = nil;
    
        // 同步到数据库并判断
        if ([self.moc save:&error]) {
    
            [self.myDataArray removeObjectAtIndex:self.selectedRow];
            [self.myTableView reloadData];
        } else {
    
            NSLog(@"delete error = %@", error);
        }
  • 修改数据
        // 获取要修改的数据
        Student *dent = self.myDataArray[self.selectedRow];
    
        // 赋值
        dent.name = self.nameTF.text;
        dent.age = self.ageTF.text.intValue;
    
        NSError *error = nil;
    
        // 同步到数据库并判断
        if ([self.moc save:&error]) {
    
            [self.myTableView reloadData];
        } else {
    
            NSLog(@"update error = %@", error);
        }
  • 查询数据
        // 查询请求
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:ENTITY_STUDENT];
    
        // 查询条件(正则表达式),name 以某些字符开头
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",
                                 [NSString stringWithFormat:@"%@*", self.nameTF.text]];
    
        // 设置请求条件,如果不设查询条件会查询所有
        request.predicate = predicate;
    
        NSError *error = nil;
    
        // 执行查询
        self.myDataArray.array = [self.moc executeFetchRequest:request error:&error];
    
        if (error) {
    
            NSLog(@"fech = %@", error);
        } else {
    
            [self.myTableView reloadData];
        }
        // 查询所有 CoreData 数据
    
        // 查询请求
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:ENTITY_STUDENT];
    
        NSError *error = nil;
    
        // 查询
        NSArray *tmpArray = [self.moc executeFetchRequest:request error:&error];
    
        if (error) {
    
            NSLog(@"fech = %@", error);
        } else {
    
            // 将查询结果存储到数据源数组中
            [self.myDataArray setArray:tmpArray];
            [self.myTableView reloadData];
        }

3、MagicalRecord 的使用

  • CoreData 是 iOS 开发中经常使用的数据持久化的技术。但其操作过程稍微繁琐,即使你只是实现简单的存取,不涉及请求优化,也要进行许多配置工作,代码量在动辄几十行,对新手来说也需要较大时间成本。
  • MagicalRecord 是 OC 的一个库,协助方便 CoreData 的工作。其吸收了 Ruby on Rails 的 Active Record 模式,目标是:
    • 简化 Core Data 相关代码
    • 允许清晰,简单,单行获取
    • 当需要优化请求的时候,仍然允许修改 NSFetchRequest
  • 如果你在使用 MagicalRecord 方法的时候不想带 MR_ 前缀,直接用 findAll 代替 MR_findAll,就在引入头文件 CoreData+MagicalRecord.h 之前增加 #define MR_SHORTHAND 即可。
  • 配置
    • 创建 Model。创建一个 Model.xcdatamodeld ,添加一个 Person Entity,添加 age firstname lastname 三个属性。最后使用 Editor => Create NSManagedObject Subclass ORM 生成 Person 类。

    • 在使用的文件中引入头文件
          // 添加宏定义
          #define MR_SHORTHAND
      
          // 引入头文件
          #import "MagicalRecord.h"
  • 初始化
        - (void)viewDidLoad {
            [super viewDidLoad];
    
            // 初始化
            [MagicalRecord setupCoreDataStackWithStoreNamed:@"Model.sqlite"];
        }
    
        - (void)dealloc {
    
            // 清理
            [MagicalRecord cleanUp];
        }
  •     Person *person = [Person MR_createEntity];
    
        person.firstname = @"Frank";
        person.lastname = @"Zhang";
        person.age = 26;
    
        [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
  •     Person *person = ...;       // 此处略,取出的数据模型
    
        [person MR_deleteEntity];
    
        [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
  •     Person *person = ...;       // 此处略,取出的数据模型
    
        person.lastname = object;
    
        [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
  •     // 查找数据库中的所有 Person。
        NSArray *persons = [Person MR_findAll];
    
        // 查找所有的 Person 并按照 first name 排序。
        NSArray *personsSorted = [Person MR_findAllSortedBy:@"firstname" ascending:YES];
    
        // 查找所有 age 属性为 25 的 Person 记录。
        NSArray *personsAgeEuqals25 = [Person MR_findByAttribute:@"age" withValue:[NSNumber numberWithInt:25]];
    
        // 查找数据库中的第一条记录
        Person *person = [Person MR_findFirst];
时间: 2024-09-30 17:44:21

iOS - CoreData 数据库存储的相关文章

iOS - SQLite 数据库存储

1.SQLite 数据库 SQLite 是一种轻型的嵌入式数据库,安卓和 iOS 开发使用的都是 SQLite 数据库.它占用资源非常低,在嵌入式设备中,可能需要几百 K 的内存数据就够了.他的处理速度比 Mysql.PostgreSQL 这两款著名的数据库都要快.数据库的存储和 Excel 很像,以表(table)为单位.表由多个字段(列.属性.column)组成,表里面的每一行数据称为记录.数据库操作包含打开数据库.创建表,表的增.删.改.查. SQL(Structured Query La

详解iOS的数据存储_IOS

iOS应用数据存储的常用方式     1.XML属性列表(plist)归档.     2.Preference(偏好设置).     3.NSKeyedArchiver归档.     4.SQLite3     5.Core Data 应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录)与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒. 模拟器应用沙盒的根路径在: (apple是用户名, 6.0是模拟器版本) /Users/apple/Library/App

iOS CoreData 增删改查详解_IOS

最近在学习CoreData, 因为项目开发中需要,特意学习和整理了一下,整理出来方便以后使用和同行借鉴.目前开发使用的Swift语言开发的项目.所以整理出来的是Swift版本,OC我就放弃了. 虽然Swift3 已经有了,目前整理的这个版本是Swift2 的.Swift 3 的话有些新特性. 需要另外调整,后续有时间再整理.  继承CoreData有两种方式:  创建项目时集成   这种方式是自动继承在AppDelegate里面,调用的使用需要通过UIApplication的方式来获取AppDe

ios coredata数据操作-iOS coredata数据操作

问题描述 iOS coredata数据操作 各位大大求指导:用coredata做个新闻类的APP,每次从服务器上请求的数据和本地coredata里面的数据进行对比(有一个专门id来区别每条信息),如果有相同的id就不对本地数据进行更新,如果本地coredata的数据库里面没有从网上请求最新的id,删除本地数据,插入新id的数据. 最终结果就是本地数据库信息条数不会变化,求指导

iOS开发数据库篇—SQLite简单介绍

一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1)归档:NSCodeing.NSKeyedArchiver (2)偏好设置:NSUserDefaults (3)Plist存储:writeToFile 提示:上述三种方法都有一个致命的缺点,那就是都无法存储大批量的数据,有性能的问题. 举例:使用归档 两个问题: (1)数据的存取都必须是完整的,要求写入的时候要一次性写入,读取的时候要一次性

mysql数据库存储路径更改 数据文件位置

mysql数据库存储路径更改  使用了VPS一段时间之后发现磁盘空间快满了.本人的VPS在购买的时候买了500gb的磁盘,提供商赠送了20GB的高性能系统磁盘.这样系统就有两个磁盘空间了.在初次安装mysql 的时候将数据库目录安装在了系统盘.(第一个磁盘)使用了一段时间之后数据库存储量变大,快将20GB的存放空间占满了.因此必须将存放数据空间换地方了.嘿嘿下面是简单的操作了,不合理之处还请大侠们指点. 操作步骤:     1.检查mysql数据库存放目录     mysql -u root -

MySQL专用开源数据库存储引擎出炉

来自国际领先的数据库厂商Solid Information Technology公司的消息宣称,该公司为MySQL量身定制的开源数据库存储引擎 ─ Solid DB Storage Engine for MySQL的Beta版,已于当地时间2006年7月25日正式对外发布.欢迎广大开源社区的用户及MySQL的忠实追随者在 http://dev.soliddb.com/download下载,抢先感受全新的.更高价值的体验. Solid公司此次面向全球开放的Solid DB Storage Engi

用C#实现图片数据库存储与显示

在网络上查找了一些资料,对C#实现图片的数据库存储与显示作个总结!所有代码都可以直接复制运行.准备数据库,在SQL2000数据库的pubs数据库中建立一个ImageStore数据表,字段有ImgID,ImageData,ImageContentType,ImageDescription,ImageSize五个字段. Let's go...... 1.图片文件的存储,代码如下:(processImage.aspx) <%@ Page language="c#" Codebehind

基于JSP实现图片的数据库存储与显示

    基于JSP实现图片的数据库存储与显示 1.引言数据库应用程序,特别是基于WEB的数据库应用程序,常会涉及到图片信息的存储和显示.通常我们使用的方法是将所要显示的图片存在特定的目录下,在数据库中保存相应的图片的名称,在JSP中建立相应的数据源,利用数据库访问技术处理图片信息.但是,如果我们想动态的显示图片,上述方法就不能满足需要了.我们必须把图片存入数据库,然后通过编程动态地显示我们需要的图片.实际操作中,可以利用JSP的编程模式来实现图片的数据库存储和显示.2.     建立后台数据库