热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

格而知之3:CoreData的基本使用

最近准备做一个随手笔记类的app给自己用,考虑到从未使用过CoreData,就决定用CoreData来做数据存储。在网上参考了一些CoreData的资料后,用一天的时间写了这个demo,主要

  最近准备做一个随手笔记类的app给自己用,考虑到从未使用过Core Data,就决定用Core Data来做数据存储。在网上参考了一些Core Data的资料后,用一天的时间写了这个demo,主要测试了增删改查,以及排序和分页这些基本功能。

  demo的代码可以在GitHub上下载:

  https://github.com/ShayneYeorg/Core-Data-Sample

 

1、大致上,Core Data即是将数据库内容封装成了类和对象:

(1)、一个数据库实例对应一个NSManagedObjectModel:根据苹果的官方文档,一个NSManagedObjectModel的实例表示程序中使用到的所有Entity的集合的提纲;

(2)、一张数据库表对应成了一个Entity实例;

(3)、数据库表中的每条记录对应一个NSManagedObject对象;

(4)、记录里的每个字段就对应了NSManagedObject对象的每一个属性。

它们之间的关系大致如下图:

 

2、接下来开始新建项目,主要记得勾选上“Use Core Data”

 

 

3、Xcode会在AppDelegate里面生成三个属性和若干方法,3个属性分别是:

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

(1)、从1中已知NSManagedObjectModel的实例即可理解为一个数据库实例;

(2)、NSManagedObjectContext是用来管理NSManagedObject的上下文,所有对NSManagedObject的实例的增删改查都要通过NSManagedObjectContext的实例来操作;

(3)、而NSManagedObjectContext的实例在将NSManagedObject的增删改查等操作结果保存到持久化存储(persistent stores)中的时候,就需要通过NSPersistentStoreCoordinator的实例来做中间人(协调员),一个NSManagedObjectContext的实例如果没有NSPersistentStoreCoordinator的实例来协助,那它在功能上就是不完整的(not fully functional)。

 

4、Entity需要手动建立。在项目中会生成一个xcdatamodeld后缀的文件,在这个文件的下方点击“Add Entity”,然后修改Entity的名称,以及添加属性:

 

同时还要根据Entity的内容生成对应的类:新建文件,选择NSManagedObject subclass类文件,根据提示勾选上对应的Entity。

那么就可以生成对应的类文件了,一个名为Article的Entity生成的类文件如下:

 

Article+CoreDataProperties文件里就包含了刚才定义好的几个属性(表字段),Article可以用来添加一些对象操作的特定方法。

 

5、接下来就是Core Data的基本增删改查操作,即是对Entity的增删改查操作。由于所有的操作都要通过NSManagedObjectContext的实例来操作,而Xcode已经在appDelegate里生成好了一个NSManagedObjectContext属性,此时要进行增删改查操作就要先把这个NSManagedObjectContext实例引进进来:

...
@property (weak, nonatomic) AppDelegate *appDelegate;
...
self.appDelegate = [[UIApplication sharedApplication] delegate];
...

 

6、Core Data的增加操作:

//新增数据
- (void)addArticle {
    NSString *title = self.titleFiled.text;
    NSString *cOntent= self.contentField.text;

    Article *article = [NSEntityDescription insertNewObjectForEntityForName:@"Article" inManagedObjectContext:self.appDelegate.managedObjectContext];
   
    article.title = title;
    article.content = [content dataUsingEncoding:NSUTF8StringEncoding];
    article.createTime = [NSDate date];
   
    NSError *error = nil;
    if ([self.appDelegate.managedObjectContext save:&error]) {
        if (error) NSLog(@"新增时发生错误:%@,%@",error,[error userInfo]);
    }
   
    [self.navigationController popViewControllerAnimated:YES];
}

 

7、Core Data的删除操作:

//删除数据
- (void)removeArticleFromDataSource:(Article *)article {
    [self.appDelegate.managedObjectContext deleteObject:article];
    NSError *error = nil;
    if(![self.appDelegate.managedObjectContext save:&error]) NSLog(@"删除数据时发生错误:%@,%@",error,[error userInfo]);
}

 

8、Core Data的修改操作:

//修改数据:每个Entity实例都会有一个独一无二的objectID,通过这个来找到Entity实例
- (void)alterArticle {
    Article *article = [self.appDelegate.managedObjectContext objectWithID:self.objectID];
    article.title = self.titleFiled.text;
    article.content = [self.contentField.text dataUsingEncoding:NSUTF8StringEncoding];
  
    NSError *error = nil;
    if ([self.appDelegate.managedObjectContext save:&error]) NSLog(@"修改成功");
   
    [self.navigationController popViewControllerAnimated:YES];
}

 

9、Core Data的查询操作:

//查询数据
- (NSMutableArray *)fetchArticlesFromDataSource {
    //request和entity,通过request来查询
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Article" inManagedObjectContext:self.appDelegate.managedObjectContext];
    [request setEntity:entity];
  
    //设置排序规则
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"createTime" ascending:NO];
    NSArray * sortDescriptors = @[sort];
    [request setSortDescriptors:sortDescriptors];
   
    //设置分页规则
    NSInteger offset = 0;
    NSInteger limit = 5;
    [request setFetchLimit:limit];
    [request setFetchOffset:offset];
 
    //设置查询条件
    NSString *str = [NSString stringWithFormat:@"title LIKE '*%@*'", searchStr];
    NSPredicate *pre = [NSPredicate predicateWithFormat:str];
    [request setPredicate:pre];
 
    //查询
    NSError *error = nil;
    NSMutableArray *articles = [[self.appDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (articles == nil) NSLog(@"查询所有数据时发生错误:%@,%@",error,[error userInfo]);
    return articles;
}

 

10、至此演示完Core Data的基本增删改查操作。

 


推荐阅读
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
author-avatar
日落月出星不离_887
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有