Swift 3.0 下使用Coredata以及读写本地文件(兼容iOS9及以下系统)

一、创建Coredata有两种方式,一种是创建项目的时候创建,另一种是直接command +N选择Coredata创建

enter description here
enter description here

二、创建CoreData工具类CodataTool.swift

//
//  CodataTool.swift
//  PricingExcellence
//
//  Created by Mr_怪蜀黍 on 2017/7/11.
//  Copyright © 2017年 LW. All rights reserved.
//

import UIKit
import CoreData

class CodataTool: NSObject {
  
  /*
   * 通过AppDelegate单利来获取管理的数据上下文对象,操作实际内容
   * 通过NSEntityDescription.insertNewObjectForEntityForName方法创建实体对象
   * 给实体对象赋值
   * 通过saveContext()保存实体对象
   */
  func SavaDataToCoredataWith(entity:String, dataDic:NSDictionary){
      do{
          //获取数据对象
          var myContext : NSManagedObjectContext!;
          if #available(iOS 10.0, *) {
              myContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
          } else {
              myContext = (UIApplication.shared.delegate as! AppDelegate).managedObjectContext
          }
          
          let inserInfo = NSEntityDescription.insertNewObject(forEntityName: entity, into: myContext);
          for (key, value) in dataDic {             // 遍历字典中的所有key value
              inserInfo.setValue(value, forKey: key as! String);
          }
          
          try myContext.save()
          
          print("保存数据成功")
          
      }catch{
          fatalError();
      }
  }
  
  /*
   查询数据
   */
  func getDataFromCoredataWith(entity:String , key:NSString)->Any{
      //获取数据对象
      var myContext : NSManagedObjectContext!;
      //声明数据的请求
      let request = NSFetchRequest<NSFetchRequestResult>(entityName: entity);
      if #available(iOS 10.0, *) {
          myContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
      } else {
          myContext = (UIApplication.shared.delegate as! AppDelegate).managedObjectContext
      }
      var requestData :Any?
      
      do{
          let dataList = try myContext.fetch(request) as! [NSManagedObject];
          
          for data in dataList as![Product] {
              
              if data.product_id == key.intValue{
                  requestData = data
                  return requestData as Any
              }else{
                  requestData = ""
              }
          }
      }catch{
          fatalError();
      }
      return requestData as Any
  }

  //清除coreData中的数据
  func deleteCoreDataWit(entity:String){
      //获取数据对象
      var myContext : NSManagedObjectContext!;
      //声明数据的请求
      let request = NSFetchRequest<NSFetchRequestResult>(entityName: entity);
      if #available(iOS 10.0, *) {
          myContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
      } else {
          myContext = (UIApplication.shared.delegate as! AppDelegate).managedObjectContext
      }

      do{
          let rels = try myContext.fetch(request) as! [NSManagedObject];
          for rel in rels{
              myContext.delete(rel);
          }
          try myContext.save();
          print("删除数据成功")
          
      }catch{
          fatalError();
      }
      
  }
  
  /**本地文件的读写*/
  func setProductNameData(){
      //取得txt文件路径
      let path = Bundle.main.path(forResource: "ProductName", ofType: "txt")!
      print (path)
      //设定路径
      let url: NSURL = NSURL(fileURLWithPath: path)
      
//        //定义可变数据变量
//        let data = NSMutableData()
//        //向数据对象中添加文本,并制定文字code
//        data.append("Hello Swift".data(using: String.Encoding.utf8, allowLossyConversion: true)!)
//        //用data写文件
//        data.write(toFile: url.path!, atomically: true)
      
      //从url里面读取数据,读取成功则赋予readData对象,读取失败则走else逻辑
      if let readData = NSData(contentsOfFile: url.path!) {
          //如果内容存在 则用readData创建文字列
//            print((data: readData as Data, encoding: String.Encoding.utf8.rawValue))
          let dataString:NSString = NSString.init(data: readData as Data, encoding: String.Encoding.utf8.rawValue) as Any as! NSString
          print(dataString)
          let array: [Any] = dataString.components(separatedBy: "\n")
         
          for index in 1...55{
              print(array[index-1])
              let dic:NSDictionary = ["name":array[index-1],"product_id":index]
              self.SavaDataToCoredataWith(entity: "Product", dataDic: dic)
          }
          
      } else {  
          //nil的话,输出空
          print("Null")
      }
  
  }

}

三、在AppDelegate.swift中关联CoreData

func applicationWillTerminate(_ application: UIApplication) {
        if #available(iOS 10.0, *) {
            self.saveContext()
        } else {
            // Fallback on earlier versions
        }
    }
    
    // MARK: - Core Data stack
    @available(iOS 10.0 , *)
    lazy var persistentContainer: NSPersistentContainer = {
       
        let container = NSPersistentContainer(name: "ProductCodata")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
            
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()
    
    lazy var applicationDocumentsDirectory: URL = {
        let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        return urls[urls.count-1]
    }()
    
    lazy var managedObjectModel: NSManagedObjectModel = {
        let modelURL = Bundle.main.url(forResource: "ProductCodata", withExtension: "momd")!
        return NSManagedObjectModel(contentsOf: modelURL)!
    }()
    
    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
        let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
        let url = self.applicationDocumentsDirectory.appendingPathComponent("ProductCodata.sqlite")
        var failureReason = "There was an error creating or loading the application's saved data."
        do {
            try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
        } catch {
            // Report any error we got.
            var dict = [String: AnyObject]()
            dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject?
            dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?
            
            dict[NSUnderlyingErrorKey] = error as NSError
            let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
            NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
            abort()
        }
        
        return coordinator
    }()
    
    lazy var managedObjectContext: NSManagedObjectContext = {
        let coordinator = self.persistentStoreCoordinator
        var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = coordinator
        return managedObjectContext
    }()
    
    // MARK: - Core Data Saving support
    @available(iOS 10.0 , *)
    func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }

四、关于多表的关联

enter description here
enter description here
enter description here
enter description here
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,093评论 4 62
  • 西达克-美罗集团是欧洲起步最早、规模最大的沙发床生产企业。西达克座位多功能沙发床的领导者和引领者。1998年,西达...
    jsfzebjj阅读 723评论 2 5
  • 成熟之后,就谁也不想再取悦,和谁在一起舒服便和谁在一起。不必很累,舒服便可以。 生活多了些烦躁,迷茫,该怎么办? ...
    卖火柴的小姑娘丶阅读 134评论 0 2