Swift教程_CoreData实例(三)_构建控制层(列表数据加载、删除数据)

简介:

Swift教程_CoreData实例(一)_构建storyboard

Swift教程_CoreData实例(二)_构建数据层

Swift教程_CoreData实例(三)_构建控制层(列表数据加载、删除数据)

Swift教程_CoreData实例(四)_构建控制层(查询、更新数据)

Swift教程_CoreData实例(五)_构建控制层(添加数据)

四、构建控制层

控制层总体结构包括列表的数据加载、数据的新增、删除、更新。这里我们先来搞定列表controller的功能(数据加载、删除),即PKOBooksTableViewController

1.列表数据加载、删除数据

我们自定义一个列表控制器PKOBooksTableViewController,并应用到storyboard的列表中。通过NSFetchedResultsController对象来查询、删除数据。

代码如下,注释非常详尽:

[objc]  view plain  copy
  1. import UIKit  
  2. import CoreData  
  3.   
  4. class PKOBooksTableViewController: UITableViewController,NSFetchedResultsControllerDelegate {  
  5.       
  6.     var managedObjectContext: NSManagedObjectContext?  
  7.     //获取数据的控制器  
  8.     var fetchedResultsController: NSFetchedResultsController?  
  9.       
  10.     override func viewDidLoad() {  
  11.         super.viewDidLoad()  
  12.           
  13.         //为导航栏左边按钮设置编辑按钮  
  14.         self.navigationItem.leftBarButtonItem = self.editButtonItem()  
  15.           
  16.         //执行获取数据,并处理异常  
  17.         var error: NSError? = nil  
  18.         if !self.initFetchedResultsController().performFetch(&error){  
  19.             NSLog("Unresolved error \(error), \(error!.userInfo)")  
  20.             abort()  
  21.         }  
  22.     }  
  23.       
  24.     override func didReceiveMemoryWarning() {  
  25.         super.didReceiveMemoryWarning()  
  26.     }  
  27.       
  28.     //设置单元格的信息  
  29.     func setCellInfo(cell: UITableViewCell, indexPath: NSIndexPath) {  
  30.         var book = self.fetchedResultsController?.objectAtIndexPath(indexPath) as Book  
  31.         NSLog("======\(book.title)")  
  32.         cell.textLabel.text = book.title  
  33.     }  
  34.       
  35.     // MARK: - Table view data source  
  36.       
  37.     override func numberOfSectionsInTableView(tableView: UITableView) -> Int {  
  38.         //分组数量  
  39.         return self.fetchedResultsController!.sections!.count  
  40.     }  
  41.       
  42.     override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {  
  43.         //每个分组的数据数量  
  44.         var section = self.fetchedResultsController!.sections![section] as NSFetchedResultsSectionInfo  
  45.         return section.numberOfObjects  
  46.     }  
  47.       
  48.       
  49.     override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {  
  50.         let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell  
  51.         // 为列表Cell赋值  
  52.         self.setCellInfo(cell, indexPath: indexPath)  
  53.         return cell  
  54.     }  
  55.       
  56.     override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {  
  57.         //分组表头显示  
  58.         return self.fetchedResultsController!.sections![section].name  
  59.     }  
  60.       
  61.     /* 
  62.     // Override to support conditional editing of the table view. 
  63.     override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
  64.     // Return NO if you do not want the specified item to be editable. 
  65.     return true 
  66.     } 
  67.     */  
  68.       
  69.     // 自定义编辑单元格时的动作,可编辑样式包括UITableViewCellEditingStyleInsert(插入)、UITableViewCellEditingStyleDelete(删除)。  
  70.     override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {  
  71.         if editingStyle == .Delete {  
  72.             //删除sqlite库中对应的数据  
  73.             var context = self.fetchedResultsController?.managedObjectContext  
  74.             context!.deleteObject(self.fetchedResultsController?.objectAtIndexPath(indexPath) as NSManagedObject)  
  75.             //删除后要进行保存  
  76.             var error: NSError? = nil  
  77.             if context?.save(&error) == nil {  
  78.                 NSLog("Unresolved error \(error), \(error!.userInfo)")  
  79.                 abort()  
  80.             }  
  81.         } else if editingStyle == .Insert {  
  82.         }  
  83.     }  
  84.       
  85.     /* 
  86.     // Override to support rearranging the table view. 
  87.     override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { 
  88.      
  89.     } 
  90.     */  
  91.       
  92.     // Override to support conditional rearranging of the table view.  
  93.     override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool {  
  94.         // 移动单元格时不要重新排序  
  95.         return false  
  96.     }  
  97.       
  98.     // MARK: - NSFetchedResultsController delegate methods to respond to additions, removals and so on.  
  99.       
  100.     //初始化获取数据的控制器  
  101.     func initFetchedResultsController() ->NSFetchedResultsController  
  102.     {  
  103.         if self.fetchedResultsController != nil {  
  104.             return self.fetchedResultsController!  
  105.         }  
  106.         // 创建一个获取数据的实例,用来查询实体  
  107.         var fetchRequest = NSFetchRequest()  
  108.         var entity = NSEntityDescription.entityForName("Book", inManagedObjectContextself.managedObjectContext!)  
  109.         fetchRequest.entity = entity  
  110.           
  111.         // 创建排序规则  
  112.         var authorDescriptor = NSSortDescriptor(key: "author", ascendingtrue)  
  113.         var titleDescriptor = NSSortDescriptor(key: "title", ascendingtrue)  
  114.         var sortDescriptors = [authorDescriptor, titleDescriptor]  
  115.         fetchRequest.sortDescriptors = sortDescriptors  
  116.           
  117.         // 创建获取数据的控制器,将section的name设置为author,可以直接用于tableViewSourceData  
  118.         var fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContextself.managedObjectContext!, sectionNameKeyPath"author", cacheName"Root")  
  119.         fetchedResultsController.delegate = self  
  120.         self.fetchedResultsController = fetchedResultsController  
  121.         return fetchedResultsController  
  122.     }  
  123.       
  124.     //通知控制器即将开始处理一个或多个的单元格变化,包括添加、删除、移动或更新。在这里处理变化时对tableView的影响,例如删除sqlite数据时同时要删除tableView中对应的单元格  
  125.     func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {  
  126.         switch(type) {  
  127.         case .Insert:  
  128.             self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.Automatic)  
  129.         case .Delete:  
  130.             self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Automatic)  
  131.         case .Update:  
  132.             self.setCellInfo(self.tableView.cellForRowAtIndexPath(indexPath!)!, indexPath: indexPath!)  
  133.         case .Move:  
  134.             self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Automatic)  
  135.             self.tableView.insertRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Automatic)  
  136.         }  
  137.     }  
  138.       
  139.     //通知控制器即将开始处理一个或多个的分组变化,包括添加、删除、移动或更新。  
  140.     func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {  
  141.         switch(type) {  
  142.         case .Insert:  
  143.             self.tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: UITableViewRowAnimation.Automatic)  
  144.         case .Delete:  
  145.             self.tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: UITableViewRowAnimation.Automatic)  
  146.         case .Update:  
  147.             break  
  148.         case .Move:  
  149.             break  
  150.         }  
  151.     }  
  152.   
  153.     //通知控制器即将有变化  
  154.     func controllerWillChangeContent(controller: NSFetchedResultsController) {  
  155.         //tableView启动变更,需要endUpdates来结束变更,类似于一个事务,统一做变化处理  
  156.         self.tableView.beginUpdates()  
  157.     }  
  158.       
  159.     //通知控制器变化完成  
  160.     func controllerDidChangeContent(controller: NSFetchedResultsController) {  
  161.         self.tableView.endUpdates()  
  162.     }  
  163.     /* 
  164.     // MARK: - Navigation 
  165.      
  166.     // In a storyboard-based application, you will often want to do a little preparation before navigation 
  167.     override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
  168.     // Get the new view controller using [segue destinationViewController]. 
  169.     // Pass the selected object to the new view controller. 
  170.     } 
  171.     */  
  172.       
  173. }  



原文地址:http://blog.csdn.net/ooppookid/article/details/40867835

相关文章
|
1月前
|
数据处理 Swift
Swift 中的运算符和表达式是构建程序逻辑的基础,包括算术、关系、逻辑、位运算符及赋值运算符,用于数值计算、条件判断、位操作、赋值与更新等
Swift 中的运算符和表达式是构建程序逻辑的基础,包括算术、关系、逻辑、位运算符及赋值运算符,用于数值计算、条件判断、位操作、赋值与更新等。掌握这些工具是编写高效代码的关键。
25 1
|
1月前
|
编译器 Swift iOS开发
Swift 教程
10月更文挑战第23天
17 1
|
6月前
|
Swift C++ 索引
Swift开发——简单函数实例
函数是编程的基础,用于封装特定功能的代码。它们有关键词func、函数名、参数列表(可为空)和返回类型。多返回值可通过元组、数组、inout参数或可选类型实现。例如,返回元组 `(value1, value2)`,数组 `[value1, value2]` 或使用可选数组 `[[Double]]?`。函数可以作为其他函数的参数,类似闭包或Lambda表达式。在Swift中,示例展示了通过元组、带索引的元组、数组和可选类型返回多个值的函数。还演示了如何使用inout参数交换变量值。
121 5
Swift开发——简单函数实例
|
7月前
|
安全 Swift Android开发
构建移动应用:Swift vs Kotlin —— 两大主流语言的对决
【5月更文挑战第11天】Swift与Kotlin在移动应用开发中各有优势。Swift是iOS开发的首选,以其简洁语法、高性能和类型安全著称;而Kotlin是Android的官方推荐语言,以其与Java的无缝互操作、空安全特性和简洁代码受到青睐。两者在语法简洁性、性能和社区支持上表现优秀,但平台兼容性不同。开发者应根据项目需求和目标平台选择合适的语言。
|
7月前
|
机器学习/深度学习 数据采集 TensorFlow
【Swift开发专栏】Swift与机器学习:构建智能应用
【4月更文挑战第30天】本文探讨了使用Swift开发机器学习应用,分为三个部分:机器学习基础(定义、类型及应用),Swift在机器学习中的作用(Swift for TensorFlow、Core ML及性能优势),以及实践技巧(数据预处理、特征工程、模型训练与部署、性能优化和用户界面集成)。通过学习,开发者能掌握构建智能应用的技能,利用Swift的性能和安全性提升应用效率。随着深入学习,开发者可探索更多高级特性和技术,如深度学习和复杂数据分析。
132 2
|
7月前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
316 1
|
7月前
|
安全 编译器 Swift
【Swift开发专栏】Swift的编译优化与构建配置
【4月更文挑战第30天】Swift编译优化与构建配置对开发效率和应用性能至关重要。编译优化包括不同级别的优化、函数内联、泛型特化、尾递归优化、死代码消除和链接时优化。在Xcode的"Build Settings"中可调整相关标志。构建配置涉及Debug与Release模式、自定义配置、条件编译、构建设置和脚本。开发时,应适时测试、选择适当优化级别、避免过度优化,并利用条件编译区分不同版本的代码。有效管理构建设置可提升开发质量和性能。
109 0
|
7月前
|
API 数据库 Swift
【Swift开发专栏】Swift中的数据持久化:Core Data与Realm
【4月更文挑战第30天】本文探讨了Swift中两种流行的数据持久化框架——Core Data和Realm。数据持久化是保持应用数据在不同运行周期间一致性的关键。Core Data,苹果的ORM系统,适合处理复杂数据关系,提供与iOS生态系统的无缝集成。使用Core Data涉及定义数据模型、生成NSManagedObject子类、配置持久化容器及执行数据操作。而 Realm,一个轻量级数据库,以其高性能、易于使用的API和实时数据同步适用于跨平台项目。在Swift中使用Realm,需定义数据模型、配置Realm实例、执行数据操作并观察数据变化。理解这两者能帮助开发者构建更高效、可靠的应用。
198 0
|
7月前
|
监控 Swift iOS开发
局域网计算机监控软件中利用Swift构建iOS端的移动监控应用
在局域网计算机监控软件的开发中,构建iOS端的移动监控应用是一项关键任务。本文将介绍如何利用Swift语言实现这一目标,通过多个代码示例展示关键功能的实现。
288 1
|
7月前
|
IDE 开发工具 Swift
Swift语言的教程
Swift语言的教程
120 1

热门文章

最新文章

相关课程

更多