2.创建项目后,您将获得“ CoreData.xcdatamodeld”,我们将创建模型实体和其他用途。 3.单击CoreData.xcdatamodeld创建一个实体。 点击“添加实体”按钮创建实体。 4.添加属性 现在,我们有了Entity和attribute,所以让我们开始将数据添加到Core Data中。 #将数据添加到核心数据 func saveData { 卫队让appDelegate = UIApplication.shared.delegate为? AppDelegate else {返回} // 1 让managedContext = appDelegate.persistentContainer.viewContext // 2 让实体= NSEntityDescription.entity(forEntityName:“ YourEntityName”,在:managedContext中)! 让person = NSManagedObject(实体:entity,insertInto:managedContext) // 3 person.setValue(nameValue,forKeyPath:“名称”) person.setValue(ageValue,forKeyPath:“ age”) // 4 做{ 尝试managedContext.save() people.append(人) let alert = UIAlertController(标题:“成功”,消息:“保存成功”,preferredStyle:UIAlertController.Style.alert) alert.addAction(UIAlertAction(title:“ Ok”,样式:UIAlertAction.Style.default,处理程序:nil)) self.present(警告,动画:true,完成:无) }将let错误捕获为NSError { //打印(“无法保存。\(错误),\(错误.userInfo)”)} } #从核心数据中检索数据 func getData(){ var […]
如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训 skype:alok.upadhyay32 邮件:meiosdose@gmail.com 应用程式:+ 91–7838552946 您好,希望您一切都好。 在这一部分中,我们将讨论NSFetchResultController( NSFRC )。 我建议您也阅读之前有关核心数据的教程: 基本 简单的应用程序 核心数据单例 使用核心数据进行单元测试 核心数据迁移 NSFetchResultController 当需要获取 , 插入 , 更新和删除核心数据并且需要更新用户界面(如UITableView和UICollectionView)时,可以使用NSFetchResultController。 每次在托管对象上下文中对托管对象模型执行插入,更新或删除操作时, NSFRC都会提供委托回调 。 NSFRC提供了performFetch()方法,该方法返回NSManagedObject模型的数组。 这个NSManagedObject模型数组与UITableViewDelegate和UITableViewDataSource方法作为提要数组一起很好地工作。 NSFRC仅适用于核心数据。 请从这里下载启动项目 请输入☕和开始代码– FetchResultController的基本初始化包含以下步骤: NSManagedObjectContext —一个管理对象上下文,NSManagedObjectContext NSFetchRequest —提取请求,其中包含有关要从核心数据存储中提取哪个实体的信息。 NSSortDescriptor —用于按升序或降序排列结果的排序描述符。 在表视图部分中显示的可选部分名称 。 缓存名称 ,如果您有一个只读数据集,则NSFetchResultController会在第一时间从存储中读取/读取数据。 下一次提取将使用缓存自动获取数据。 显然是一个NSFetchedResultsController类。 一个负责获取诸如插入,更新,删除之类的核心数据操作的回调的委托 。 初始化 请牢记所有这些要点,以便打开入门项目并在CoreDataManager类中的代码下面复制粘贴: 懒惰的var fetchedResultsController:NSFetchedResultsController = { //初始化提取请求 让appDelegate = UIApplication.shared.delegate为! AppDelegate […]
如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训 skype:alok.upadhyay32 邮件:meiosdose@gmail.com 应用程式:+ 91–7838552946 第1部分。 大家好。 在本教程中,我们将使用核心数据和Swift 4创建一个应用程序。我们将能够在核心数据中插入 , 更新 , 删除和获取个人记录。 Person将具有两个属性name和ssn(社会保险号)。 我们还将学习如何使用谓词执行条件操作(filter或sqlite中的where子句)。 这是源代码的链接。 请输入☕和开始代码– 让我们创建新项目,如附加的屏幕截图: 给它起一个名字“ PersonData”,选择语言“ Swift”并选中“ Use Core Data”和“ Include Unit Tests(是的,我们还将进行单元测试:))”: 单击下一步。 现在查看您的项目结构。 它有一个名为“ PersonData.xcdatamodeld”的文件。 那么“ PersonData.xcdatamodeld”是什么? 在上述步骤中,当我们在Xcode中启动新项目并打开模板选择对话框时,选中“使用核心数据”复选框,将创建核心数据模型的源文件作为模板的一部分。 该源文件将具有扩展名.xcdatamodeld 。 这是一个xml文件 。 在导航器区域中选择该文件以显示Core Data模型编辑器。 单击“显示包内容”,也可以打开和查看文件。 双击内容,它不过是一个xml文件: 您可以使用“ xcdatamodeled”的可视化编辑器来创建“实体”,“实体属性”,“获取请求”,“配置”和“关系”。 当我们执行核心数据迁移时,此文件非常重要。 现在,让我们深入研究“ AppDelegate.swift”文件并讨论代码。 AppDelegate文件包含与核心数据相关的应用程序生命周期方法和代码存根。 我们仅对核心数据感兴趣。 它包含了: 导入CoreData框架 初始化NSPersistentContainer类,然后初始化核心数据堆栈对象(托管对象模型,PersistentStoreCoordinator,托管对象上下文)。 一个名为saveContext()的方法。 它将托管对象模型保存到存储中。 当应用程序即将终止时,名为applicationWillTerminate的应用程序生命周期方法也会调用saveContext()来将数据保存在存储中。 […]
很抱歉在100天内从此处删除。 我本来不是打算确切地下车100天,但是我花了大约这么长时间才完成我留在Udacity iOS开发人员Nanodegree中的所有项目。 现在,我仍然有职业发展项目,以便毕业于我的Nanodegree Plus。 我希望在今年年底之前完成这些课程,但是我也一直有时间拿到我的Nano学位(除非Udacity提供扩展)。 无论如何,让我们退后一步,解释一下我最近100天学到的知识。 “在地图上”项目是有关学习如何与服务器端API通信以将数据获取到iOS设备的全部内容。 这非常困难,因为您必须进行身份验证(使用用户名/密码登录),然后将JSON中的数据“转换”为数组或字典。 最难的概念是此过程的异步性质。 您真的不知道服务器响应并向您提供数据所需的时间和时间。 您可能还会向服务器发送多个请求,并且很有可能会收到与发送请求顺序不符的响应,因此必须使用完成处理程序使它们保持顺序。 最重要的是,您必须在后台队列中执行所有这些操作,以便在等待服务器中的数据时不会冻结UI。 之后的项目是虚拟游客。 该项目以我在“在地图上”中学到的知识为基础,添加了“核心数据”,这是一种在iOS设备上存储数据库数据的方法。 这确实很棘手,当我决定切换到Swift 3时,我遇到了很多困难。因为Apple对Core Data进行了许多更改,所以我没有感觉到任何课程材料(在Swift 2.2中)就像我完全迷路了。 我在互联网上搜索了所有资源,以找到有关Swift 3中Core Data的完整教程,最后得到了Ray Wenderlich团队的Swift 3 Core Data书。 RW团队的教学方式是示例性的,因此很容易看到事情的运作方式。 不利的一面(去年我经历了一些iOS教程时就经历了这种方式)是,它们给出了太多的答案,当您从自己的想法中找出来时,您学到的东西不多拥有。 但是这本书当时对我来说是完美的,因为它阐明了苹果公司对Core Data所做的所有更改,并且我可以继续努力。 核心数据最难的概念是并发性。 当您有多个项目试图同时访问(写入或读取)Core Data中的数据库时,会发生这种情况? 如果安装不正确,则很可能会导致随机崩溃。 我对此还没有一个很好的概念,但是我知道每次使用Core Data时,都会添加额外的参数来调试并发问题,并尝试在上下文中执行每个Core Data任务。 如果您不使用Core Data,那么最后一部分可能没有多大意义,但是我不了解该主题,无法全面解释该主题(如果我用枪指着我的头,我可能会更好地解释它,但是我非常希望您阅读这篇文章)。 这样就使我进入了最终项目。 没有更多的学习。 这是关于使用我所学到的一切并将其自己整合到应用程序中。 好吧,没有更多的学习部分是不正确的。 实际上,我最终学到了很多东西,因为当我整理我的应用程序时,最终使用了很多课堂上没有教过的东西(NSFetchedResultsController,UISegmentedControl,UIStepper,UIPickerView)。 我可能会在另一篇文章中介绍我的应用程序,因为我真的应该继续从事我的Nanodegree的职业发展部分,因为这是我注册Nanodegree Plus时的一项要求。 在这一点上,我很高兴我即将结束这一旅程,我将再发表一篇文章,让大家知道我是否完成了我的纳米学位。 PS只是对Apple Watch自动解锁功能的更新,结果证明我使用的是WatchOS 3的Beta版,而自动解锁在Beta中无法正常使用。 我很高兴地说“自动解锁”现在可以正常工作,但充其量只能在大约75%到85%的时间内工作。 尽管我的手表还有另一个更新,但这与我所使用的Apple的标准相去甚远。 它可能会改善自动解锁的性能,但是长达一个小时的更新(我记得有些时候去年才长达4个小时)令人费解,这是Apple真正应该做的事情。
决定任何iOS应用程序性能的一个重要因素是其对搜索查询的响应能力。 它响应越快,性能越好。 成功的搜索结果取决于用于存储应用程序数据的数据库的效率。 您可以将Core Data视为在iOS,macOS,tvOS和watchOS应用程序中保存,跟踪,修改和过滤数据的框架,但是Core Data不是数据库。 核心数据使用SQLite作为持久存储,但框架本身不是数据库。 核心数据的功能远不止数据库,例如管理对象图,跟踪数据的变化以及更多其他事情。 核心数据可帮助您构建代表应用程序状态的应用程序模型层。 核心数据可以将模型对象的状态持久保存到磁盘。 核心数据关注对象,而不是传统的表驱动关系数据库方法。 在存储数据时,实际上是在存储对象的内容,其中对象由继承NSManagedObject类的Objective-C / Swift类表示。 一个典型的应用程序将几个对象一起使用,形成一个对象图。 核心数据和SQLite之间的区别 SQLite本身就是一个数据库,就像我们拥有MS SQL Server 。 但是CoreData是类似于ORM (对象关系模型)的框架,该框架在database和UI之间创建一个层。 它speeds-up交互process ,因为我们不必write queries ,只需使用ORM并让ORM处理后端即可。 核心数据将对象图保存在内存中。 这意味着,只有将记录加载到内存中后,它才能对记录进行操作。 这与在数据库上执行SQL查询有很大不同。 如果要删除数千条记录,Core Data首先需要将每条记录加载到内存中。 另一个限制是核心数据的线程模型。 该框架期望在单个线程上运行。 核心数据具有3个关键对象: 托管对象上下文 托管对象模型 持久性商店协调员 永久存储(存储) 设置永久容器 使用NSPersistentContainer设置核心数据栈 在上一教程中,您了解了Core Data堆栈和涉及的类。 在本教程中,我们将学习…… cocoacasts.com 动手使用Xcode piyush23dez / Swift4_CoreData_Demo Swift 4中的核心数据基础。通过在 github.com 上创建一个帐户,为piyush23dez / Swift4_CoreData_Demo开发做出了贡献。 核心数据中的实体关系 […]
大多数时候,我们的应用程序都具有数据存储功能,例如缓存,提供脱机支持或提高应用程序性能等目的。 在本系列文章中,我们将探索一些设计技巧,并为提高iOS应用程序上的Core Data性能奠定基础。 这会导致iPad App的fps下降。 它不仅降低了fps速度,而且使我们的应用程序反复缓慢。 滚动tableview / collection视图确实很痛苦,因为App暂时停止了。 如果不运行Core Data工具,我将不会发现此问题。 规则1:测量,测量和测量 如果进行测量,您会发现板子前面有问题。 那么为什么不先这样做呢? 进行一些操作通常会导致我获取大量数据,因为我对记录中的每个项目都进行了重复的访存调用。 由于每个记录都可以使用其ID进行标识 您可以告诉CD根据ID一次获取所有记录。 编号:[Int] 让fetchRequest = NSFetchRequest (entityName:“ MyEntity”) fetchRequest.predicate = NSPredicate(格式:“ id IN%@”,id) 虽然它减少了我的提取次数,但仍然没有帮助我减少保存 算是因为我在做这样的傻事: 下载的记录中的ID { //在此更改托管对象的上下文并将其保存在context.perform { 做{ 尝试context.save() }将let错误捕获为NSError { fatalError(“错误:\(error.localizedDescription)”) } } } 由于Core Data将获取的对象保留在上下文中(在内存中),因此您可以修改存在于上下文中的获取的对象。 除非您清除上下文,否则上下文会保留MO的更改。 所以现在我们的代码看起来像: 下载的记录中的ID { //在此处更改托管对象的上下文。 updateEntity() //变更将在上下文中存在 } //现在保存上下文。 这会将更改从上下文推送到存储。 context.perform […]
核心数据是Apple在OS X和iOS操作系统中提供的对象图和持久性框架。 这是一个非常独特的功能,可以在本地存储和映射具有不同层次结构的各种数据(文本,图像等)。 为什么要使用核心数据 当您需要存储每次打开应用程序时都不想从服务器检索的数据,或者需要离线使用应用程序并且仍想跟踪数据时,Core Data很有用。 优点 核心数据在本地管理数据,这意味着它具有持久性存储。 每次应用启动或关闭时,都可以随时随时加载或保存数据。 Core Data设法提供了许多有用的功能,可以节省大量时间。 一件事是称为“核心数据模型编辑器”的图形对象模型编辑器。 它提供了一个界面,供您以清晰的方式创建各种实体和属性,以显示它们之间的关系。 另外,与在代码中更改实体或属性相比,使用此模型可以更轻松地在以后更改实体或属性。 Core Data提供了关系连接功能,您只需要在XCModel中添加一个关系即可显示每个实体与另一个实体之间的关系,还可以指定任何一对一,一对多或多对多的关系关系变成一个简单的干净的面向对象的界面。 某种程度上,这就像某些数据库一样,提供了一种简单的方法来管理核心数据。 例 我们在Go Ahead Tours移动应用程序中广泛使用了Core Data框架。 例如,我们的移动团队决定使用Core Data在聊天功能中保存消息。 因此,显然,我们需要创建一个具有不同属性(如messageID)和内容(如文本,图像或位置信息)的消息实体。 另外,由于每个巡回包含一个唯一的聊天室,并且某些用户可能具有多个巡回,因此我们需要将消息与巡回连接的关系。 因此,我们将其设置为一对多关系,其中每个消息都属于其唯一的旅程。 因此,每当我们将消息存储到核心数据中时,我们只需要将特定的旅程添加到消息实体中即可。 因此,与游览相关的每个消息都将具有与游览相关的相同密钥值。 同时,我们在游览类中创建了一组消息,用于存储消息。 每次我们需要检索消息时,我们只需要进行游览,并使其返回所有消息即可。
核心数据是Apple为macOS和iOS设计的框架,可持久存储对象。 它本质上是SQLite的抽象。 Apple提供了有关Core Data的综合指南,但鉴于其复杂性,可能需要一段时间才能通过。 在这篇文章中,如果您要构建现代应用程序,我将介绍正确入门的基础知识。 我还将介绍核心数据的一些重要方面,这些方面可能并不明显,但在许多教程中经常被忽略。 设定 因此,您刚刚在Xcode中创建了一个新项目,并选中了“使用核心数据”复选框(如果没有,则将丢失文件,请查看下一段以获取详细信息)。 默认情况下,Xcode将与Core Data相关的方法添加到您的AppDelegate类。 如今,这样做是一种不好的做法。 在我看来,您的AppDelegate应该只管理应用程序的生命周期。 多年来,Core Data变得越来越复杂和强大,因此最好将数据存储代码放在单独的类中。 绝对从AppDelegate中删除以下内容: //标记下的所有内容:-如果使用Swift,则为核心数据堆栈; #pragma标记下的所有内容;如果使用Objective-C,则为核心数据 堆栈 。 未选中“使用核心数据” 如果在创建项目时未选中“使用核心数据”复选框,则您的AppDelegate应该是干净的,您只需要创建一个文件:数据模型即可。 在项目浏览器中右键单击您的主项目文件夹,然后单击“新建文件…”,选择“ iOS”>“核心数据”,然后单击“数据模型”,然后单击“下一步”,然后按照步骤保存文件。 实体 我不会花很多时间谈论创建实体和关系,因为它很简单,没有技巧,并且有很多很棒的指南,例如tutsplus博客或objc.io博客。 还可以查看江豪的关于创建实体和关系的文章。 打开.xcdatamodeld文件,您应该具有如下所示的内容: 只需单击屏幕底部的“添加实体”按钮,即可随意添加一些属性,更改实体名称并使用编辑器。 现在,最重要的部分是将您的实体映射到类。 选择您的实体,然后在导航栏中单击“编辑器”,然后单击“创建NSManagedObject子类…”: 选择对象模型,然后选择实体并创建文件。 如果使用Swift,将为您创建两个文件(如果使用Objective-C,则为四个文件)。 一个类将是NSManagedObject的子类 。 此类仅应包含对象的方法,另一个应为该对象的扩展,并且应包含属性(请注意,相反的方法也可以,您可以在NSManagedObject子类上具有属性,而在扩展上具有方法)。 我的理解和对此可能是错的,因为我们将它们分开以保持清洁。 例如,您可以拥有一个插件,该插件可以在更改模型时自动重新生成实体类,而不会覆盖您的方法。 数据存储单例 现在,您应该创建一个新的单例类,该类将为您的应用程序提供数据管理方法(因为我们已从AppDelegate中删除了这些方法)。 如果您没有时间阅读我的文章,可以在这里找到一个很好的Objective-C示例:https://gist.github.com/NachoMan/922496。 但是请知道,此代码是非ARC的,因此,如果要在iOS应用中使用它,则只需摆脱–(void)dealloc方法。 如果您有时间,请查看下面的“ 线程”部分,这很重要! 苹果还展示了在Objective-C和Swift中可用的稍微复杂一点的单例。 如果您有几分钟的时间,那么让我们逐一介绍一下单例所需的方法(在Swift中): 物产 让我们从一个具有以下属性的新类开始(自行替换字符串): ManagedObjectModel ManagedObjectModel本质上是从.xcdatamodeld文件加载的数据模型。 只需将“ MyApp”替换为模型文件的实际名称即可。 现在您可能想知道扩展名为什么是“ momd” ,这是因为我们要引用模型的编译版本,而您无法在“项目浏览器”中查看该版本。 将以下内容添加到您的DataManager类中: […]
核心数据基础 核心数据是应用程序的模型层,或者可以说核心数据是一个框架,该框架管理对象图并通过将对象图写入磁盘来持久化该对象图。 核心数据具有3个关键对象: 托管对象模型 持久性商店协调员 托管对象上下文 托管对象模型 :它代表我们应用程序的数据模型,它包含有关对象图的模型或实体,它们具有哪些属性以及它们之间如何关联的信息。 持久性存储协调器 :它将数据持久化到磁盘并确保持久性存储和数据模型 兼容,并且还充当托管对象上下文之间的中介者 和持久性存储。 持久性存储协调器与持久性存储进行对话,并确保数据已保存,加载和缓存。 它通过托管对象模型了解对象图的数据模型和架构。 托管对象上下文:它管理模型对象的集合。 就像一个工作台,我们在其中处理模型对象,加载它们,对其进行操作并将它们保存在工作台上。 我们的应用程序通过托管对象上下文访问对象图, 通过持久性存储协调器了解数据模型。 受管对象上下文向持久性存储协调器询问数据,并告诉它在必要时保存数据。 例: 获取上下文 2.建立模型 3.保存数据 4.提取数据 5.清除数据
第7章:核心数据与并发 假设您正在开发一个小型或简单的应用程序,那么您可能看不到在后台运行Core Data操作的好处。 但是,如果在第一次启动应用程序时在主线程上导入了数百或数千条记录,将会发生什么情况? 结果可能是戏剧性的。 当使用核心数据时,我们在现实的编程世界中都面临着所有这些问题,因此让我们讨论解决方案。 基本: 核心数据是用于管理应用程序中的模型层对象的框架 并发是同时处理多个队列上的数据的能力。 脚步: *初始化核心数据栈 使用模型文件创建管理对象模型实例 使用管理对象模型实例创建持久性存储协调器 使用SQLite或SQLite dB的其他类型和文件路径在PSC实例中添加永久存储 创建并发类型为NSMainQueueConcurrencyType和NSPrivateQueueConcurrencyType托管对象上下文。 在“管理”对象模型实例中设置持久性存储协调器。 *创建和保存托管对象 使用NSEntityDescription实体创建实体 使用实体和MOC创建需要插入的行实例,该实例将成为被管理对象实例。 在MO实例中设置Value 将MO条目保存在核心数据中-上下文。 保存() *提取对象 准备实体的NSFetchRequest类型的请求 let request = NSFetchRequest (实体名称:“用户”) 2.从上下文中以[NSManagedObject]数组的形式获取结果 让结果=尝试context.fetch(request) 3.遍历数组以获取特定键的值 对于数据结果! [NSManagedObject] 核心数据堆栈设置-简单方法(NSPersistentContainer) 设置核心数据堆栈需要一些工作。 典型的设置需要许多步骤: 从应用程序捆绑包中加载托管对象模型 使用模型创建一个持久性存储协调器 要求协调器加载持久性存储 创建一个或多个托管对象上下文 从iOS 10开始, NSPersistentContainer 删除了大部分样板代码。 在应用程序中封装核心数据堆栈的容器。 如果采用一些简单的命名约定和默认存储位置,则核心数据栈的设置可以像这样简单: container = NSPersistentContainer(name: “storeName”) container.loadPersistentStores { (storeDescription, […]