iOS App中数据管理框架Core Data的基本数据操作教程_IOS

NSEntityDescription是实体描述对象,它可以类比如数据库中的表,NSEntityDescription存放的是表的结构信息。这些类都是一些抽象的结构类,并不存储实际每条数据的信息,具体的数据由NSManagedObject类来描述,我们一般会将实体类化继承于NSManagedObject。

Xocde工具提供了快捷的实体类化功能,还拿我们一开始创建的班级与学生实体来演示,点击.xcdatamodeld文件,点击Xcode工具上方导航栏的Editor标签,选择Creat NSManagedObject Subclass选项,在弹出的窗口中勾选要类化的实体,如下图:

这时,Xcode会自动为我们创建一个文件,这些文件中有各个类中属性的声明。

一、创建一条数据

使用如下代码进行数据的创建:

    //读取数据模型文件
    NSURL *modelUrl = [[NSBundle mainBundle]URLForResource:@"Model" withExtension:@"momd"];
    //创建数据模型
    NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl];
    //创建持久化存储协调者
    NSPersistentStoreCoordinator * psc = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:mom];
    //数据库保存路径
    NSURL * path =[NSURL fileURLWithPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoreDataExample.sqlite"]];
    //为持久化协调者添加一个数据接收栈
    /*
    可以支持的类型如下:
     NSString * const NSSQLiteStoreType;//sqlite
     NSString * const NSXMLStoreType;//XML
     NSString * const NSBinaryStoreType;//二进制
     NSString * const NSInMemoryStoreType;//内存
    */
    [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:path options:nil error:nil];
    //创建数据管理上下文
    NSManagedObjectContext * moc = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
    //关联持久化协调者
    [moc setPersistentStoreCoordinator:psc];
    //创建数据对象
    /*
    数据对象的创建是通过实体名获取到的
    */
    SchoolClass * modelS = [NSEntityDescription insertNewObjectForEntityForName:@"SchoolClass" inManagedObjectContext:moc];
    //对数据进行设置
    modelS.name = @"第一班";
    modelS.stuNum = @60;
    //进行存储
    if ([moc save:nil]) {
        NSLog(@"新增成功");
    }
    NSLog(@"%@",[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoreDataExample.sqlite"]);
找到在打印出的路径,会发现里面多了一个sqlite文件,其中有一张表中添加进了一条数据。

二、查询数据

CoreData中通过查询请求来对数据进行查询操作,查询请求由NSFetchRequest来进行管理和维护。

NSFetchRequest主要提供两个方面的查询服务:

1.提供范围查询的相关功能

2.提供查询结果返回类型与排序的相关功能

NSFetchRequest中常用方法如下:

//创建一个实体的查询请求 可以理解为在某个表中进行查询
+ (instancetype)fetchRequestWithEntityName:(NSString*)entityName;
//查询条件
@property (nullable, nonatomic, strong) NSPredicate *predicate;
//数据排序
@property (nullable, nonatomic, strong) NSArray<NSSortDescriptor *> *sortDescriptors;
//每次查询返回的数据条数
@property (nonatomic) NSUInteger fetchLimit;
//设置查询到数据的返回类型
/*
typedef NS_OPTIONS(NSUInteger, NSFetchRequestResultType) {
    NSManagedObjectResultType  = 0x00,
    NSManagedObjectIDResultType  = 0x01,
    NSDictionaryResultType          NS_ENUM_AVAILABLE(10_6,3_0) = 0x02,
    NSCountResultType    NS_ENUM_AVAILABLE(10_6,3_0) = 0x04
};
*/
@property (nonatomic) NSFetchRequestResultType resultType;
//设置查询结果是否包含子实体
@property (nonatomic) BOOL includesSubentities;
//设置要查询的属性值
@property (nullable, nonatomic, copy) NSArray *propertiesToFetch;
在SchoolClass实体中查询数据,使用如下的代码:

    //创建一条查询请求
    NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"SchoolClass"];
    //设置条件为 stuNum=60的数据
    [request setPredicate:[NSPredicate predicateWithFormat:@"stuNum == 60"]];
    //进行查询操作
    NSArray * res = [moc executeFetchRequest:request error:nil];
    NSLog(@"%@",[res.firstObject stuNum]);

进行数据初始化

    NSFetchedResultsController的初始化需要一个查询请求和一个数据操作上下文。代码示例如下:

//遵守协议
@interface ViewController ()<NSFetchedResultsControllerDelegate>
{
    //数据桥接对象
    NSFetchedResultsController * _fecCon;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //进行初始化操作
    NSURL *modelUrl = [[NSBundle mainBundle]URLForResource:@"Model" withExtension:@"momd"];
    NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl];
    NSPersistentStoreCoordinator * psc = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:mom];
    NSURL * path =[NSURL fileURLWithPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoreDataExample.sqlite"]];
    [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:path options:nil error:nil];
    NSManagedObjectContext * moc = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
    [moc setPersistentStoreCoordinator:psc];
    NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"SchoolClass"];
    //设置数据排序
    [request setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"stuNum" ascending:YES]]];
    //进行数据桥接对象的初始化
    _fecCon = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:nil cacheName:nil];
    //设置代理
    _fecCon.delegate=self;
    //进行数据查询
    [_fecCon performFetch:nil];
}
@end
用于初始化NSFecthedResultsController的数据请求对象必须设置一个排序规则。在initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:方法中,如果设置第三个参数,则会以第三个参数为键值进行数据的分区。当数据发生变化时,将通过代理进行方法的回调。

三、与UITableView进行数据绑定

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cellid"];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellid"];
    }
    //获取相应数据模型
    SchoolClass * obj = [_fecCon objectAtIndexPath:indexPath];
    cell.textLabel.text = obj.name;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"有%@人",obj.stuNum];
    return cell;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return [_fecCon sections].count;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    id<NSFetchedResultsSectionInfo> info =  [_fecCon sections][section];
    return [info numberOfObjects];
   
}
效果如下:

四、将数据变化映射到视图

//数据将要改变时调用的方法
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    //开启tableView更新预处理
    [[self tableView] beginUpdates];
}
//分区数据改变时调用的方法
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    //判断行为类型
    switch(type) {
        //插入新分区
        case NSFetchedResultsChangeInsert:
            [[self tableView] insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //删除分区
        case NSFetchedResultsChangeDelete:
            [[self tableView] deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //移动分区
        case NSFetchedResultsChangeMove:
        //更新分区
        case NSFetchedResultsChangeUpdate:
            break;
    }
}
//数据改变时回调的代理
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
    switch(type) {
        //插入数据
        case NSFetchedResultsChangeInsert:
            [[self tableView] insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //删除数据
        case NSFetchedResultsChangeDelete:
            [[self tableView] deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //更新数据
        case NSFetchedResultsChangeUpdate:
            [self reloadData];
            break;
        //移动数据
        case NSFetchedResultsChangeMove:
            [[self tableView] deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [[self tableView] insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}
//数据更新结束调用的代理
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [[self tableView] endUpdates];
}

时间: 2024-12-24 08:53:01

iOS App中数据管理框架Core Data的基本数据操作教程_IOS的相关文章

详解iOS App中图片的线段涂鸦功能的添加方法_IOS

接下来我们要讲图片的涂鸦,我们分开一点一点拓展,先给图片上划线 创建项目 起名testAddLine 接下来我们在默认生成的ViewController中添加一张图片 待用同时添加一个按钮 复制代码 代码如下: - (void)viewDidLoad {      [super viewDidLoad];      // Do any additional setup after loading the view, typically from a nib.            UIImage

iOS APP 中的不可变模型以及一致性数据

本文讲的是iOS APP 中的不可变模型以及一致性数据, 今年早些时候,为了给用户,尤其是大部分海外的用户更快更清晰的体验,我们全面重构了我们的 iOS 应用.这次重构的其中一个目的是将我们的应用迁移到一个不可变模型的层面上.在这篇博客中,我将会讨论这样做的动机,并探索我们的新系统是如何处理模型的更新,从 API 读取新信息,以及保持数据持久性的. 为什么选择不可变模型? 因为现今许多应用都转而使用了不可变设计,'不可变模型'已经成为了一个耳熟能详的术语.不可变性意味着再初始化后模型将不可再更改

sqlite-ios中SQLite和core data使用求解

问题描述 ios中SQLite和core data使用求解 本人ios开发小白一枚,有几点疑问想咨询一下ios开发前辈. 第一:在ios app开发中,什么类型的应用会用到SQLite或者core data:第二:已经在运营中的电商类型的网站,数据库使用的是mysql,现在需要开发ios的app,app端的数据应该怎么和服务器进行通信呢?登陆,下单,支付等操作时的通信怎么才能保证数据传输的安全性呢? 解决方案 (1)需要本地数据存储的,需要离线运行的(2)使用web service,加密传输的信

问题就是啊啊-iOS app中怎么实现发红包功能

问题描述 iOS app中怎么实现发红包功能 求大神指导啊啊啊啊,公司最新的想法,现在还不知道恩么弄,有时候uiszhidao的的啊真希望不要哈哈哈发 你那么大开发建设的飞机哦圣诞节发来撒可对方能卡死的叫法开始的缴费卡拉斯的减肥你看拉水泥的反馈暗示对方的大师傅 解决方案 app 评论功能实现ios开发之APP升级的实现iOS App运行在后台实现定位以及播放音频功能 解决方案二: 不就是集成一个支付功能吗?UI方面想怎么设计都可以啊

iOS 8中可能会加入全新的分屏操作功能

iOS 8中可能会加入全新的分屏操作功能,只适用于横屏模式下的iPad.你可以在iPad屏幕上打开两个应用,一边一个.微软的Surface也可以在一个屏幕上进行多任务操作,方便企业用户的工作. 另外,iOS 8中同此功能配套的,还有让应用之间的互动变得更容易,比如可以把一个应用中的内容拖拽到另一个中去,文字图片或者视频都行.据称苹果计划把这项功能开放给开发者,这意味着iOS应用间的内容分享将成为可能. 据称这项分屏新功能是为9.7寸iPad做的,不知道iPad mini能不能用,另外,也许正在研

详解iOS App中UITableView的创建与内容刷新_IOS

UITableView几乎是iOS开发中用处最广的一个控件,当然也是要记相当多东西的一个控件. 创建首先创建一个新的项目,并添加一个MainViewController的Class文件 打开MainViewController.h文件 @interface MainViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> @property (nonatomic, retain) NSArray *

iOS App中实现播放音效和音乐功能的简单示例_IOS

播放音效iOS开发过程中可能会遇到播放音效的功能 其实很简单,iOS已经提供了一个框架直接负责播放音效 AudioToolbox.framework 新建项目  TestWeChatSounds 给新建的项目导入AudioToolbox.framework 导入成功之后如下图 项目目录如下 接下来我们给项目中添加几个caf格式的音效文件 接下来 我们打开 项目默认生成的ViewController中添加代码 导入 AudioToolbox 复制代码 代码如下: #import <AudioToo

iOS开发中使用CoreLocation框架处理地理编码的方法_IOS

一.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 (1)导航:去任意陌生的地方 (2)周边:找餐馆.找酒店.找银行.找电影院 2.在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发 (1)Map Kit :用于地图展示 (2)Core Location :用于地理定位  3.两个热门专业术语 (1)LBS :Location Based Service(基于定位的服务) (2)SoLoMo :Social Local Mob

iOS开发中使用UIScrollView实现无限循环的图片浏览器_IOS

一.概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件都介绍一遍确实没有必要,所谓授人以鱼不如授人以渔,这里会尽可能让大家明白其中的原理,找一些典型的控件进行说明,这样一来大家就可以触类旁通.今天我们主要来看一下UIScrollView的内容: UIView UIScrollView 实战--图片浏览器 二.UIView 在熟悉UIScrollView之前很有必要说一下UIView的内容.