亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS CoreData 增刪改查詳解

2020-07-26 03:14:12
字體:
來源:轉載
供稿:網友

最近在學習CoreData, 因為項目開發中需要,特意學習和整理了一下,整理出來方便以后使用和同行借鑒。目前開發使用的Swift語言開發的項目。所以整理出來的是Swift版本,OC我就放棄了。 雖然Swift3 已經有了,目前整理的這個版本是Swift2 的。Swift 3 的話有些新特性。 需要另外調整,后續有時間再整理。 

繼承CoreData有兩種方式: 

創建項目時集成

 

這種方式是自動繼承在AppDelegate里面,調用的使用需要通過UIApplication的方式來獲取AppDelegate得到Conext。本人不喜歡這種方式,不喜歡AppDelegate太多代碼堆在一起,整理了一下這種方式

將CoreData繼承的代碼單獨解耦出來做一個單例類 

項目結構圖

 

項目文件說明 
CoreData核心的文件就是 
1.XPStoreManager(管理CoreData的單例類) 
2.CoredataDemo.xcdatamodeld (CoreData數據模型文件)
 3.Student+CoreDataProperites.swift和Student.swift (學生對象) 
4.ViewController.swift 和Main.storyboard是示例代碼

細節代碼 

1. XPStoreManager.swift
CoreData數據管理單例類

//// XPStoreManager.swift// CoreDataDemo//// Created by xiaopin on 16/9/16.// Copyright © 2016年 xiaopin.cnblogs.com. All rights reserved.// import CoreData /// 本地數據庫管理類:默認是寫在AppDelegate的,可以這樣分離出來class XPStoreManager {  //單例寫法 static let shareInstance = XPStoreManager()  private init() {   }  // MARK: - Core Data stack  lazy var applicationDocumentsDirectory: NSURL = {  // The directory the application uses to store the Core Data store file. This code uses a directory named "com.pinguo.CoreDataDemo" in the application's documents Application Support directory.  let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)  print("/(urls[urls.count-1])")  return urls[urls.count-1] }()  lazy var managedObjectModel: NSManagedObjectModel = {  // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.  let modelURL = NSBundle.mainBundle().URLForResource("CoreDataDemo", withExtension: "momd")!  return NSManagedObjectModel(contentsOfURL: modelURL)! }()  lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {  // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.  // Create the coordinator and store  let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)  let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")  var failureReason = "There was an error creating or loading the application's saved data."  do {   try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)  } catch {   // Report any error we got.   var dict = [String: AnyObject]()   dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"   dict[NSLocalizedFailureReasonErrorKey] = failureReason      dict[NSUnderlyingErrorKey] = error as NSError   let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)   // Replace this with code to handle the error appropriately.   // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.   NSLog("Unresolved error /(wrappedError), /(wrappedError.userInfo)")   abort()  }    return coordinator }()  lazy var managedObjectContext: NSManagedObjectContext = {  // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.  let coordinator = self.persistentStoreCoordinator  var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)  managedObjectContext.persistentStoreCoordinator = coordinator  return managedObjectContext }()  // MARK: - Core Data Saving support  func saveContext () {  if managedObjectContext.hasChanges {   do {    try managedObjectContext.save()   } catch {    // Replace this implementation with code to handle the error appropriately.    // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.    let nserror = error as NSError    NSLog("Unresolved error /(nserror), /(nserror.userInfo)")    abort()   }  } } }

2.AppDelegate.swift 

在這個行數中加入一句代碼,退出后執行保存一下

func applicationWillTerminate(application: UIApplication) {  // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.  // Saves changes in the application's managed object context before the application terminates.  XPStoreManager.shareInstance.saveContext() }

3.Student.swift 

編寫了針對這個學生對象的增刪改查 

//// Student.swift// CoreDataDemo//// Created by cdmac on 16/9/12.// Copyright © 2016年 xiaopin.cnblogs.com. All rights reserved.// import Foundationimport CoreData class Student: NSManagedObject { // Insert code here to add functionality to your managed object subclass /*  一般涉及到的情況有:增刪改,單對象查詢,分頁查詢(所有,條件查詢,排序),對象是否存在,批量增加,批量修改  */  /// 判斷對象是否存在, obj參數是當前屬性的字典 class func exsitsObject(obj:[String:String]) -> Bool {    //獲取管理數據對象的上下文  let context = XPStoreManager.shareInstance.managedObjectContext  //聲明一個數據請求  let fetchRequest = NSFetchRequest(entityName: "Student")    //組合過濾參數  let stuId = obj["stuId"]  let name = obj["name"]    //方式一  let predicate1 = NSPredicate(format: "stuId = %@", stuId!)  let predicate2 = NSPredicate(format: "name = %@", name!)  //合成過濾條件  //or ,and, not , 意思是:或與非,懂數據庫的同學應該就很容易明白  let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: [predicate1,predicate2])  //let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1,predicate2])  fetchRequest.predicate = predicate    //方式二  //fetchRequest.predicate = NSPredicate(format: "stuId = %@ or name = %@", stuId!, name!)  //fetchRequest.predicate = NSPredicate(format: "stuId = %@ and name = %@", stuId!, name!)    do{   let fetchObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)      return fetchObjects?.count > 0 ? true : false  }catch {   fatalError("exsitsObject /(error)")  }    return false }  /// 添加對象, obj參數是當前屬性的字典 class func insertObject(obj: [String:String]) -> Bool {    //如果存在對象了就返回  if exsitsObject(obj) {   return false  }    //獲取管理的數據上下文 對象  let context = XPStoreManager.shareInstance.managedObjectContext    //創建學生對象  let stu = NSEntityDescription.insertNewObjectForEntityForName("Student",                  inManagedObjectContext: context) as! Student   //對象賦值  let sexStr:String  if obj["sex"] == "男"{   sexStr = "1"  }else{   sexStr = "0"  }  let numberFMT = NSNumberFormatter()  numberFMT.numberStyle = .NoStyle  stu.stuId = numberFMT.numberFromString(obj["stuId"]!)  stu.name = obj["name"]  stu.createtime = NSDate()  stu.sex = numberFMT.numberFromString(sexStr)  stu.classId = numberFMT.numberFromString(obj["classId"]!)    //保存  do {   try context.save()   print("保存成功!")   return true  } catch {   fatalError("不能保存:/(error)")  }  return false }  /// 刪除對象 class func deleteObject(obj:Student) -> Bool{    //獲取管理的數據上下文 對象  let context = XPStoreManager.shareInstance.managedObjectContext    //方式一: 比如說列表已經是從數據庫中獲取的對象,直接調用CoreData默認的刪除方法  context.deleteObject(obj)  XPStoreManager.shareInstance.saveContext()    //方式二:通過obj參數比如:id,name ,通過這樣的條件去查詢一個對象一個,把這個對象從數據庫中刪除  //代碼:略    return true }  /// 更新對象 class func updateObject(obj:[String: String]) -> Bool {  //obj參數說明:當前對象的要更新的字段信息,唯一標志是必須的,其他的是可選屬性  let context = XPStoreManager.shareInstance.managedObjectContext    let oid = obj["stuId"]  let student:Student = self.fetchObjectById(Int(oid!)!)! as! Student    //遍歷參數,然后替換相應的參數  let numberFMT = NSNumberFormatter()  numberFMT.numberStyle = .NoStyle    for key in obj.keys {   switch key {   case "name":    student.name = obj["name"]   case "classId":    student.classId = numberFMT.numberFromString(obj["classId"]!)   default:    print("如果有其他參數需要修改,類似")   }  }    //執行更新操作  do {   try context.save()   print("更新成功!")   return true  } catch {   fatalError("不能保存:/(error)")  }    return false }   /// 查詢對象 class func fetchObjects(pageIndex:Int, pageSize:Int) -> [AnyObject]? {  //獲取管理的數據上下文 對象  let context = XPStoreManager.shareInstance.managedObjectContext    //聲明數據的請求  let fetchRequest:NSFetchRequest = NSFetchRequest(entityName: "Student")  fetchRequest.fetchLimit = pageSize //每頁大小  fetchRequest.fetchOffset = pageIndex * pageSize //第幾頁    //設置查詢條件:參考exsitsObject  //let predicate = NSPredicate(format: "id= '1' ", "")  //fetchRequest.predicate = predicate    //設置排序  //按學生ID降序  let stuIdSort = NSSortDescriptor(key: "stuId", ascending: false)  //按照姓名升序  let nameSort = NSSortDescriptor(key: "name", ascending: true)  let sortDescriptors:[NSSortDescriptor] = [stuIdSort,nameSort]  fetchRequest.sortDescriptors = sortDescriptors    //查詢操作  do {   let fetchedObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)      //遍歷查詢的結果   /*   for info:Student in fetchedObjects as! [Student]{    print("id=/(info.stuId)")    print("name=/(info.name)")    print("sex=/(info.sex)")    print("classId=/(info.classId)")    print("createTime=/(info.createtime)")    print("-------------------")       }    */   return fetchedObjects  }  catch {   fatalError("不能保存:/(error)")  }  return nil }   /// 根據ID查詢當個對象 class func fetchObjectById(oid:Int) -> AnyObject?{    //獲取上下文對象  let context = XPStoreManager.shareInstance.managedObjectContext    //創建查詢對象  let fetchRequest:NSFetchRequest = NSFetchRequest(entityName: "Student")    //構造參數  fetchRequest.predicate = NSPredicate(format: "stuId = %@", String(oid))    //執行代碼并返回結果  do{   let results:[AnyObject]? = try context.executeFetchRequest(fetchRequest)      if results?.count > 0 {    return results![0]   }  }catch{   fatalError("查詢當個對象致命錯誤:/(error)")  }    return nil }}

4.ViewController.swift 

具體使用: 

//// ViewController.swift// CoreDataDemo//// Created by cdmac on 16/9/11.// Copyright © 2016年 pinguo. All rights reserved.// import UIKit let cellIdentifiler = "ReuseCell" class ViewController: UIViewController { @IBOutlet weak var txtNo: UITextField! @IBOutlet weak var txtName: UITextField! @IBOutlet weak var txtSex: UITextField! @IBOutlet weak var txtClassId: UITextField! @IBOutlet weak var tableView: UITableView! var dataArray:[AnyObject]?  override func viewDidLoad() {  super.viewDidLoad()  // Do any additional setup after loading the view, typically from a nib.  self.dataArray = Student.fetchObjects(0, pageSize: 20)  self.tableView.reloadData() }  override func didReceiveMemoryWarning() {  super.didReceiveMemoryWarning()  // Dispose of any resources that can be recreated. }   @IBAction func addAction(sender: AnyObject) {   var dic = [String:String]()    dic["stuId"] = txtNo.text  dic["name"] = txtName.text  dic["sex"] = txtSex.text  dic["classId"] = txtClassId.text    if Student.insertObject(dic) {   print("添加成功")   self.dataArray = Student.fetchObjects(0,pageSize: 20)      self.tableView.reloadData()  }else{   print("添加失敗")  } }  @IBAction func updateAction(sender: AnyObject) {    var dic = [String:String]()    dic["stuId"] = txtNo.text  dic["name"] = txtName.text  //dic["sex"] = txtSex.text  dic["classId"] = txtClassId.text    if Student.updateObject(dic) {   print("更新成功")   self.dataArray = Student.fetchObjects(0,pageSize: 20)      self.tableView.reloadData()  }else{   print("更新失敗")  }   } } extension ViewController:UITableViewDelegate,UITableViewDataSource{  //表格有多少組 func numberOfSectionsInTableView(tableView: UITableView) -> Int {  return 1 }  //每組多少行 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {  if self.dataArray != nil && self.dataArray?.count > 0 {   return self.dataArray!.count  }  return 0 }  //高度 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {  return 50 }  //單元格加載 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {  let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifiler)    let stu:Student = self.dataArray![indexPath.row] as! Student    let label1:UILabel = cell?.contentView.viewWithTag(10001) as! UILabel  let label2:UILabel = cell?.contentView.viewWithTag(10002) as! UILabel  var sexStr = "男"  if stu.sex?.intValue != 1 {   sexStr = "女"  }  label1.text = "/(stu.stuId!) /(stu.name!) /(sexStr) /(stu.classId!)"  label2.text = "http://xiaopin.cnblogs.com"    return cell! }  //選中 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {   }  func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {  return true }  func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {  if editingStyle == .Delete {   //獲取當前對象   let student:Student = self.dataArray![indexPath.row] as! Student      //刪除本地存儲   Student.deleteObject(student)      //刷新數據源   self.dataArray?.removeAtIndex(indexPath.row)   //self.dataArray = Student.fetchObjects(0, pageSize: 20)      //刪除單元格   tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)  } }  func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {  return .Delete }  func tableView(tableView: UITableView, titleForDeleteConfirmationButtonForRowAtIndexPath indexPath: NSIndexPath) -> String? {  return "刪除" }}

運行效果圖

 

源碼下載:CoreDataDemo.zip

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久热在线中文字幕色999舞| 久久久日本电影| 欧美亚洲国产成人精品| 欧美二区乱c黑人| 亚洲免费电影在线观看| zzijzzij亚洲日本成熟少妇| 色爱精品视频一区| 欧美日韩精品二区| 神马久久久久久| 亚洲一区国产精品| 亚洲加勒比久久88色综合| 欧美伊久线香蕉线新在线| 欧美日韩国产精品专区| 美女福利精品视频| 欧美激情手机在线视频| 欧美日韩日本国产| 91高潮在线观看| 欧美午夜无遮挡| 亚洲国产日韩一区| 亚洲色图13p| 97碰碰碰免费色视频| 亚洲第一福利网| 亚洲视频在线看| 日韩免费av一区二区| 精品一区二区电影| 欧美乱人伦中文字幕在线| 国产精品丝袜久久久久久高清| 97精品视频在线观看| 81精品国产乱码久久久久久| 在线视频中文亚洲| 精品高清一区二区三区| 在线性视频日韩欧美| 国产成人综合一区二区三区| 亚洲精品v欧美精品v日韩精品| 国产精品jizz在线观看麻豆| 原创国产精品91| 国产在线拍揄自揄视频不卡99| 亚洲经典中文字幕| 国产成人精品国内自产拍免费看| 久久男人的天堂| 亚洲成avwww人| 成人午夜激情免费视频| 欧美在线视频免费观看| 久久琪琪电影院| 一区二区亚洲欧洲国产日韩| 日韩欧美国产免费播放| 亚洲黄色av网站| 国产精品稀缺呦系列在线| 久久久久久久久久久久av| 国产成人一区二区三区小说| 精品国产网站地址| 欧美性资源免费| 久久精品中文字幕一区| 精品中文字幕在线2019| 国产美女久久精品| 亚洲高清免费观看高清完整版| 亚洲第一在线视频| 亚洲摸下面视频| 国产中文字幕日韩| 中文字幕亚洲无线码a| 中文字幕无线精品亚洲乱码一区| 亚洲丝袜在线视频| 韩国三级日本三级少妇99| 亚洲精品福利在线观看| 日韩理论片久久| 大胆欧美人体视频| 久久九九免费视频| 亚洲性日韩精品一区二区| 亚洲白虎美女被爆操| 亚洲r级在线观看| 国产亚洲欧洲在线| 精品久久久久久中文字幕大豆网| 91亚洲精华国产精华| 国产区亚洲区欧美区| 国产视频亚洲精品| 爽爽爽爽爽爽爽成人免费观看| 精品国产拍在线观看| 中文日韩电影网站| 欧美主播福利视频| 中文字幕亚洲一区| 欧美国产精品人人做人人爱| 亚洲自拍偷拍区| 国产成人精品最新| 欧美成在线观看| 国产在线高清精品| 亚洲男人天天操| 欧美一级在线亚洲天堂| 国内精品在线一区| 欧美日韩成人在线观看| 欲色天天网综合久久| 国产精品88a∨| 日韩精品一区二区视频| 久久男人资源视频| 一区二区亚洲欧洲国产日韩| 欧美另类交人妖| 久久99久久99精品免观看粉嫩| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲激情电影中文字幕| 亚洲一区二区久久久| 一区二区三区 在线观看视| 国产97色在线| 成人亲热视频网站| 成人免费淫片aa视频免费| 欧美日韩人人澡狠狠躁视频| 国内自拍欧美激情| 欧美孕妇性xx| 欧美在线欧美在线| 麻豆乱码国产一区二区三区| 国产欧美日韩精品专区| 欧美中文在线字幕| 国产视频精品xxxx| 亚洲人成啪啪网站| 久久久久久有精品国产| 国产精品一区二区电影| 欧美色视频日本版| 日韩精品视频在线观看免费| 久久亚洲精品国产亚洲老地址| 亚洲免费高清视频| 国产亚洲人成网站在线观看| 亚洲天堂男人的天堂| 国产精品福利久久久| 日韩av在线播放资源| 成人亚洲欧美一区二区三区| 日韩欧美高清视频| 伊是香蕉大人久久| 国产精品丝袜久久久久久高清| 国产综合在线视频| 久久精品国产欧美激情| 国产精品久久999| 色悠悠久久88| 成人免费午夜电影| 欧美日韩国产综合视频在线观看中文| 亚洲精品v天堂中文字幕| 国产suv精品一区二区| 国产91亚洲精品| 国产精品看片资源| 欧美精品videosex牲欧美| 欧美猛交免费看| 久久香蕉精品香蕉| 日韩黄色高清视频| 久久人人看视频| 亚洲第一网站免费视频| 日韩中文字幕在线免费观看| 亚洲影视九九影院在线观看| 国产欧美精品在线播放| 欧美视频13p| 国产精品夫妻激情| 九九久久久久99精品| 97国产精品久久| 亚洲欧美国产一区二区三区| 国产精品久久综合av爱欲tv| 91在线精品视频| 成人美女免费网站视频| 国产成人aa精品一区在线播放| 亚洲一区精品电影| 在线观看国产精品淫| 国产成人拍精品视频午夜网站| 亚洲性生活视频| 日韩精品在线播放| 国产一区二区三区在线观看网站| 亚洲精品成人av| 亚洲美女在线看| 中文日韩在线视频| 九九热这里只有在线精品视|