swift 3 Xcode 8 中的 NSManagedObject 和 CoreData

Posted

技术标签:

【中文标题】swift 3 Xcode 8 中的 NSManagedObject 和 CoreData【英文标题】:NSManagedObject and CoreData in swift 3 Xcode 8 【发布时间】:2016-11-01 08:00:32 【问题描述】:

我正在使用 Xcode 8 和 swift 3,我正在从编辑器菜单 NSManageObjectModel 为我的实体创建 NSManagedObject,如何使用此文件来获取和创建对象,在 Xcode 7 中我正在使用核心数据堆栈来创建管理对象、持久存储和 ,....现在我不知道如何在swift 3中使用核心数据。

【问题讨论】:

【参考方案1】:

swift 3 中的以下核心数据代码使用 x 代码 8 及更高版本工作正常,部署目标可以是低 ios 8 及更高版本,一旦尝试即可工作。我逐步编写代码。

1)在appdelegate中导入Coredata

          import UIKit
          import CoreData


        @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate 
              var window: UIWindow?

    在 appdelegate 中添加的这段代码中,只有当 coredata 在所有版本的操作系统中工作时,你才需要这段代码

    private lazy var applicationDocumentsDirectory: URL = 
      let urls = FileManager.default.urls(for: .documentDirectory, in:
                                      .userDomainMask)
    
     return urls[urls.count-1]
     ()
     //   Core Data stack
    
    
    lazy var managedObjectModel: NSManagedObjectModel = 
    let modelURL = Bundle.main.url(forResource: "Coredata", withExtension: "momd")!
    return NSManagedObjectModel(contentsOf: modelURL)!
    ()
    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = 
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.appendingPathComponent("SingleViewCoreData.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 
        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
      ()
     //   Core Data Saving support
         func saveContext () 
         if managedObjectContext.hasChanges 
        do 
            try managedObjectContext.save()
         catch 
            let nserror = error as NSError
            NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
            abort()
         
        
       
    

    3.保存数据这是你需要的数据保存到数据库然后 你写下面的代码 这个在 ViewControllers 类中的写入只是再次导入 coredata 并创建 NSManagedObject

          var dataBase = [NSManagedObject]()
    
    
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let managedContext = appDelegate.managedObjectContext
        let entity =  NSEntityDescription.entity(forEntityName:
    
       "YourEntityName",in:managedContext)
        let activityData = NSManagedObject(entity: entity!,insertInto:
        managedContext)
        activityData.setValue(storeData1, forKey: "attributeKey1")
        activityData.setValue(storeData2, forKey: "attributeKey2")
    
        do 
            try managedContext.save()
            dataBase.append(activityData)
    
    
         catch let error as NSError  
            print("Could not save \(error), \(error.userInfo)")
        
    
    
    

    4.你在哪个类中获取数据然后你写这段代码这里也一样 就是这样

    import coredata and create NSMangedObject
    
       var getData= [NSManagedObject]()
    

    //获取数据 func getLogsData()

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "YourEntityName")
    
    do 
        let results = try managedContext.fetch(fetchRequest)
    
          catch let error as NSError 
        print("Could not fetch \(error), \(error.userInfo)")
    
    

【讨论】:

以上是关于swift 3 Xcode 8 中的 NSManagedObject 和 CoreData的主要内容,如果未能解决你的问题,请参考以下文章

swift 3 和 Xcode 8 中的完成处理程序错误

Xcode 8.3.3 中的 iOS Swift Researchkit 谓词问题

Xcode 8 / Swift 3 中的 iOS 异步单元测试(waitForExpectations 失败)

如果 Swift 3/Xcode 8 中的“活动”列是“否”,如何隐藏单元格

尝试呈现其视图不在窗口层次结构中的 UIAlertController (Swift 3/Xcode 8)

如何更改xcode 8.3.3(swift3)的语言设置[重复]