IOS开发之--Core Data的使用

Core Data基础知识

官方的说法是:Core Data is a schema-driven object graph management and persistence framework.

翻译过来的意思大概是:Core Data是一个模式驱动的对象图管理和持久化框架。

好吧,上面的字面意思不是很容易理解,那么我们从以下几个方面来帮助那些有其余开发经验的程序员树立一些观念:

  1. Core Data不是一个数据库,但是他可能使用一个数据库。默认情况下,Core Data将使用SQLite,但是你可以完全不用关心任何关系型数据库相关知识,或者SQL语句;
  2. Core Data不是一个类似于Hibernate的对象关系映射框架。Core Data仅仅是一个对象间的关系模型,用户无需数据库知识,并且数据也不一定保存在数据库中;
  3. Core Data允许你去保存模型对象到文件中并且可以在需要的时候取回数据,这一系列操作类似于打包和序列化操作,但是Core Data能够做的更多;

Core Data能够做的比较强大的功能包括:

  1. Core Data提供了维护模型对象变化的基础能力,这样你可以执行撤销和重做操作,并且Core Data可以维护对象间的相互关系;
  2. Core Data允许你在给定时间内在内存中保留模型对象的一个子集,这对于严苛的iOS内存环境相当重要;
  3. 使用Schema来描述模型对象。你可以在一个图形化的编辑器中定义你的模型的主要特性,甚至可以包含各个对象间的关系。这样提供了一个简单的手段来保证一个基本的健壮性,例如可以设置缺省值和属性值的验证;
  4. 允许你维护对象的不想交集合。例如,允许你在一个视图中对对象进行编辑,但这个内容可能被丢弃,导致另一个视图中不更新对象;
  5. 对对象的版本管理操作提供支持,这样可以很方便的将旧版对象升级为新版对象;

Core Data不是一个单独的类,而是一群需要互相协作的类的集合。整个Core Data的架构图是比较复杂的:

实例

MyCoreData

    1. 建立一个新的Empty工程,名字叫MyCoreData,工程属性选择Core Data和ARC支持;
    2. 在继续下一步之前,我们了解几个内容:
      • Managed Object Model,描述了你将在App中使用的Schema。如果你有数据库背景知识,你可以想象一下数据库的Schema。这里的Schema实际上指的是一个对象(或者说实体)的集合。在XCode中,模型被保存在.xcdatamodeld文件中。你可以使用可视化的编辑器来定义实体、属性、关系等;
      • Persistent Store Coordinator,在iOS中默认使用SQLite存储持久化数据,当然Core Data提供了存储不同实体到不同存储对象的手段。PSC就是对存储手段进行维护的管理器。当然你完全可以忘记这个对象,因为你基本上不需要和他直接交互;
      • Managed Object Context,这个对象用于管理对象的序列化和反序列化工作,也是在使用Core Data Stack时主要使用的工具;
      • 整理下可以发现,从底层往上的顺序分别是:DataStore->Persistent Object Store->Persistent Store Coordinator->Managed Object Context->App;
    3. 基本概念讲完了,我们点击项目生成的.xcdatamodel文件,点击Add Entity,添加一个实体,名字叫Novel;
    4. 添加属性,定义如下的三个属性值:
    5. 创建用户界面,在File->New中创建一个StoryBoard,然后在Project属性中设置为这个Story Board;
    6. 在AppDelegate.m文件中,将自动生成的didFinishLaunchingWithOptions方法的实现清空,变为:

      [cpp] view plaincopy

      1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      2. {
      3. return YES;
      4. }
    7. 在Story Board编辑界面中,添加一个Table View Controller、一个View Controller,设置Table View Controller跳转到View Controller(注意选择Segue的Modal,因为后面使用dismissViewController来释放Details窗口),并且Embed in到Navigator View Controller;
    8. 在Table View Controller中添加一个Button,并且选择Button的Identifier为Add,使之变成一个加号按钮;
    9. 选择Table View的Cell,将其Style修改为Right Detail;
    10. 去那个名为Details的View Controller,先放置一个Navigation Bar到界面上面,然后拖动两个Button到Navigation Bar上面,并且分别设置对应的Bar Button Item的Identifier属性为Cancel和Save,如下:
    11. 在Details界面中添加三个text field,并且分别设置他们的placeholder属性为:name、author、version;
    12. ListView上面的那个加号按钮在点击时需要跳转到Details界面,所以需要在Story Board上选择这个按钮,按住Control键,拖动到Details这个View之上后释放鼠标,选择Segue->Modal;
    13. 在源代码文件夹中创建一个Object-C类,命名为NovelListViewController,父类选择UITableViewController;
    14. 在Story Board中,将Table View的Class设置为NovelListViewController;
    15. 同样,设置Details这个View的Class为新建立的NovelDetailsViewController;
    16. 在NovelDetailsViewController中生成和界面中的TextField对应的控件变量及响应方法:

      [cpp] view plaincopy

      1. #import <UIKit/UIKit.h>
      2. @interface NovelDetailsViewController : UIViewController
      3. @property (strong, nonatomic) IBOutlet UITextField *tfName;
      4. @property (strong, nonatomic) IBOutlet UITextField *tfAuthor;
      5. @property (strong, nonatomic) IBOutlet UITextField *tfVersion;
      6. - (IBAction)cancel:(id)sender;
      7. - (IBAction)save:(id)sender;
      8. @end
    17. 接下来进入正题,我们将进入操作Core Data的阶段。我们将要实现的主要功能包括:在Details页面中保存数据,在List页面中将数据取回;
    18. 在NovelDetailsViewController.m中加入代码:

      [cpp] view plaincopy

      1. - (NSManagedObjectContext *)managedObjectContext {
      2. NSManagedObjectContext *context = nil;
      3. id delegate = [[UIApplication sharedApplication] delegate];
      4. if ([delegate performSelector:@selector(managedObjectContext)]) {
      5. context = [delegate managedObjectContext];
      6. }
      7. return context;
      8. }
    19. 记得我们当时对工程添加Core Data支持的时候,我们的AppDelegate中自动添加了一个Managed Object Context,我们将使用这个Context来保存或者取回对象;
    20. 我们将两个按钮的事件处理方法变为:

      [cpp] view plaincopy

      1. - (IBAction)cancel:(id)sender {
      2. [self dismissViewControllerAnimated:YES completion:nil];
      3. }
      4. - (IBAction)save:(id)sender {
      5. // get Managed Object Context
      6. NSManagedObjectContext *context = [self managedObjectContext];
      7. // Create a new managed object
      8. NSManagedObject *newNovel = [NSEntityDescription insertNewObjectForEntityForName:@"Novel" inManagedObjectContext:context];
      9. [newNovel setValue:self.tfName.text forKey:@"name"];
      10. [newNovel setValue:self.tfAuthor.text forKey:@"author"];
      11. [newNovel setValue:self.tfVersion.text forKey:@"version"];
      12. NSError *error = nil;
      13. // Save the object to persistent store
      14. if (![context save:&error]) {
      15. NSLog(@"Can‘t Save! %@ %@", error, [error localizedDescription]);
      16. }
      17. [self dismissViewControllerAnimated:YES completion:nil];
      18. }

      当点击Cancel按钮的时候,我们使用一个动画方式将Details窗口关闭掉。
      当点击Save按钮的时候,我们首先获取Context,然后创建一个新的Managed Object,设置novel的属性,接着调用context的save来存储数据,最后关闭界面。

    21. 现在我们看如何获取列表。我们在TableViewController中添加一个数组用来保存Novel的列表:

      [cpp] view plaincopy

      1. #import <UIKit/UIKit.h>
      2. @interface NovelListViewController : UITableViewController
      3. @property(strong, nonatomic) NSMutableArray *novelList;
      4. @end
    22. 同样对于List页面需要添加获取Context和加载时获取数组元素列表接口:

      [cpp] view plaincopy

      1. @implementation NovelListViewController
      2. @synthesize novelList;
      3. - (NSManagedObjectContext *)managedObjectContext
      4. {
      5. NSManagedObjectContext *context = nil;
      6. id delegate = [[UIApplication sharedApplication] delegate];
      7. if ([delegate performSelector:@selector(managedObjectContext)]) {
      8. context = [delegate managedObjectContext];
      9. }
      10. return context;
      11. }
      12. - (void)viewDidAppear:(BOOL)animated
      13. {
      14. [super viewDidAppear:animated];
      15. // Fetch the devices from persistent data store
      16. NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
      17. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Novel"];
      18. self.novelList = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
      19. [self.tableView reloadData];
      20. }
    23. 接下来改造List界面的表格显示模块:

      [cpp] view plaincopy

      1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
      2. {
      3. #warning Potentially incomplete method implementation.
      4. // Return the number of sections.
      5. return 1;
      6. }
      7. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
      8. {
      9. #warning Incomplete method implementation.
      10. // Return the number of rows in the section.
      11. return self.novelList.count;
      12. }
      13. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
      14. {
      15. static NSString *CellIdentifier = @"Cell";
      16. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
      17. // Configure the cell...
      18. NSManagedObject *device = [self.novelList objectAtIndex:indexPath.row];
      19. [cell.textLabel setText:[NSString stringWithFormat:@"%@ %@", [device valueForKey:@"name"], [device valueForKey:@"version"]]];
      20. [cell.detailTextLabel setText:[device valueForKey:@"author"]];
      21. return cell;
      22. }

      注意在Story Board中设置Table View Cell的Identifier属性值为Cell,与代码中的保持一致。

    24. 至此,程序功能全部完成,查看发现数据能够正常保存,但我们没有写一行和数据库相关的代码。
时间: 2024-11-13 12:47:51

IOS开发之--Core Data的使用的相关文章

IOS开发之--Core Data的使用(进阶)

CoreData的使用(进阶) 本次目标是创建一个应用程序,可以记录每次你保存的经纬度坐标,并且可以对这些坐标(我们保存为一个Event实体)进行编辑. 建立工程 步骤 创建一个Empty Application,起名叫Locations,选择Devices为iPhone,并且使用ARC: 添加CoreLocation.framework: 添加一个Storyboard文件,并在工程属性中选择Main Storyboard为这个文件: 至此,操作步骤完成. 对工程的理解 以上步骤完成后,我们的工

ios开发:Core Data概述

Core Data 概述 2005年的四月份,Apple 发布了 OS X 10.4,在这个版本中 Core Data 框架发布了.Core Data本身既不是数据库也不是数据库访问框架.相反,Core Data是一个完整的数据模型解决方案.可以简单理解为对持久层的封装,使得我们可以通过可视化建立数据模型,简化数据存取.即使不懂SQL语句,也依然可以使用Core Data.因为Core Data将底层的数据库SQL语句封装成了一套API,并可通过可视化操作来建立数据库的模型和表之间的关系,它甚至

iOS教程:Core Data数据持久性存储基础教程

其实最近更多的是在写这篇文章<iOS教程:使用持久性数据Core Data>,这篇是<iOS开发教程:Storyboard全解析-第一部分>这篇的后续,但是目前还没有完成,先放出一个持久性数据存储的教程以供参考.这其实是一篇翻译文章,英文的原文见这里.我翻译的过程中改变了一些内容以便适应我们中国人的口味,下面请看教程: 就像我一直说的,Core Data是iOS编程,乃至Mac编程中使用持久性数据存储的最佳方式,本质上来说,Core Data使用的就是SQLite,但是通过一系列特

OC开发_Storyboard——Core Data

一 .NSManagedObjectContext 1.我们要想操作Core Data,首先需要一个NSManagedObjectContext2.那我们如何获得Context呢:创建一个UIManagedDocument 二.UIManagedDocument 1.UIManagedDocument是一系列用于管理存储的机制:  [将Core Data数据库放入某存储空间,相当于是管理core data 数据库的存储,所以我们只需要打开和存储]2.那我们如何得到UIManagedDocumen

zz 说说iOS的多线程Core Data

Core Data是iOS中很重要的一个部分,可以理解为基于SQLite(当然也可以是其他的Storage,如In-memory,只是SQLite比较常见)的一个ORM实现,所以有关系数据库的特性,又不用写SQL.顺便吐一下槽,官方说法是使用Core Data能减少50%-70%的代码量,但相信用过的人应该都心里明白,Core Data使用起来还是比较麻烦的,这也是为什么有不少的第三方类库来代替/二次包装Core Data. 稍微复杂的应用就有可能出现同时处理多份数据的情况,这就需要用到多线程C

iOS开发笔记--Core Bluetooth开发

推荐阅读文章:http://blog.csdn.net/pony_maggie/article/details/26740237 一.前言 CoreBluetooth框架的核心其实是两个东西,peripheral和central, 可以理解成外设和中心.对应他们分别有一组相关的API和类,如下图所示: 二.Core Bluetooth 的基本常识:1. 每个蓝牙设备都是通过服务和特征来展示自己 一个设备必然包含一个或多给服务,每个服务下面又包含多个特征2.特征是与外界交互的最小单位 比如说,一台

iOS教程:如何使用Core Data – 预加载和引入数据

这是接着上一次<iOS教程:Core Data数据持久性存储基础教程>的后续教程,程序也会使用上一次制作完成的. 再上一个教程中,我们只做了一个数据模型,之后我们使用这个数据模型中的数据创建了一个表视图,我们还学习了如何测试数据模型的可行性,今天,我们来看看如何在应用启动的时候,将已经存在的数据载入或者引用到我们的程序中去. 请注意我们在上一次的教程中学习到的是直接通过操作SQLite数据库来加载数据,你当然可以一直使用这种方法,但是这个教程教授的方法更加优雅,更加合理. 在下一部分的教程中,

Core Data 使用

简单的介绍一下 ios 数据持久化  Core Data 使用 话不多说,直接上图 接下来,在工程中 command+N 新建Core Data 文件 创建成功后,接下编辑Core Data 文件 接下来,给实体添加属性 依照添加的属性来生成相应的Model User 实体打上勾下一步 工程会自动生成 User 的Model #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @interface User

ios开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

               在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文本框内容的创建.修改,退出后台,再重新回到后台,来认识这两种持久化数据的方式.效果图如下[图1]: [图1 GUI界面效果图] [本次开发环境: Xcode:7.2     iOS Simulator:iphone6S plus   By:啊左]     一.数据库SQL