首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将核心数据添加到现有的Xcode9 Swift 4 iOS 11项目中?

如何将核心数据添加到现有的Xcode9 Swift 4 iOS 11项目中?
EN

Stack Overflow用户
提问于 2018-02-11 02:10:00
回答 4查看 22.5K关注 0票数 19

请求更新,因为这个问题当然已经在以前的版本中得到了回答,日期为12/16的最新搜索结果与以前的iOS 9和10项目不相关。

文档当然说在开始新项目时选择使用核心数据复选框,我没有选择,但是现在我认为需要添加iCloud +核心数据来将我的应用程序带到它的下一阶段->,其中需要像NSFileCoordinator和NSFilePresenter这样的东西,因为在我的应用程序UI中向用户呈现了许多主题,每个主题都有三个选项,关于哪些用户将选择一个选项。然后,对于每个主题,UI显示选择了每个选项的用户总数以及每个选项占总数的百分比。

但是,网站提出了NSFileCoordinator和NSFilePresenter已经解决的同步读/写问题。

因此,如果iCloud +核心数据系统可以在发送新的普遍存在的容器数值总数和百分比值之前,在云中插入现有的普遍存在的容器数值总数的基本算术计算-在接收到来自个人用户的写数值命令时-那么我将非常感谢如何修复下面在尝试创建和初始化核心数据堆栈时产生的错误。不然的话,我想我将不得不放弃Xcode,转而使用像PhoneGap这样的混合应用,如果这是最适合这项工作的话。

因此,请参考Core Data Programming Guide:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/InitializingtheCoreDataStack.html#//apple_ref/doc/uid/TP40001075-CH4-SW1

并在我现有项目的开始处粘贴以下代码,生成

使用无法解析的标识符“persistentContainer”…‘managedObjectContext’

..。错误。和这条线

代码语言:javascript
复制
init(completionClosure: @escaping () -> ()) { 

..。生成

初始值设定项只能在类型中声明

代码语言:javascript
复制
import UIKit

import CoreData
class DataController: NSObject {
  var managedObjectContext: NSManagedObjectContext
  init(completionClosure: @escaping () -> ()) {
    persistentContainer = NSPersistentContainer(name: "DataModel")
    persistentContainer.loadPersistentStores() { (description, error) in
      if let error = error {
        fatalError("Failed to load Core Data stack: \(error)")
      }
      completionClosure()
    }
  }
}

init(completionClosure: @escaping () -> ()) {
  //This resource is the same name as your xcdatamodeld contained in your project
  guard let modelURL = Bundle.main.url(forResource: "DataModel", withExtension:"momd") else {
    fatalError("Error loading model from bundle")
  }
  // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
  guard let mom = NSManagedObjectModel(contentsOf: modelURL) else {
    fatalError("Error initializing mom from: \(modelURL)")
  }

  let psc = NSPersistentStoreCoordinator(managedObjectModel: mom)

  managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType)
  managedObjectContext.persistentStoreCoordinator = psc

  let queue = DispatchQueue.global(qos: DispatchQoS.QoSClass.background)
  queue.async {
    guard let docURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last else {
      fatalError("Unable to resolve document directory")
    }
    let storeURL = docURL.appendingPathComponent("DataModel.sqlite")
    do {
      try psc.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storeURL, options: nil)
      //The callback block is expected to complete the User Interface and therefore should be presented back on the main queue so that the user interface does not need to be concerned with which queue this call is coming from.
      DispatchQueue.main.sync(execute: completionClosure)
    } catch {
      fatalError("Error migrating store: \(error)")
    }
  }
}

// followed by my existing working code:

class ViewController: UIViewController {
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-11 03:12:16

转到文件>新文件...,选择iOS下的核心数据模型,然后选择数据模型当您在项目创建过程中选择核心数据时,您仍然需要xcode自动生成的一些代码。要获得它,只需创建新项目并选中核心数据选项,然后复制** //标记下编写的所有代码:-核心数据堆栈**在AppDelegate.swift中添加注释

代码语言:javascript
复制
import CoreData

上图

可选

在复制lazy var persistentContainer的完成块后,不要忘记更改应用程序的名称。在这一部分修改你的应用的名称*NSPersistentContainer( name:“应该是你的应用的名称”)和你刚刚复制的代码的managedObjectModel函数**

票数 45
EN

Stack Overflow用户

发布于 2019-03-29 08:41:06

如果你像我一样懒惰,这里是你需要从新的核心数据项目中复制的所有代码……(为什么让每个人都创建一个新项目?)更改YOUR_APP_NAME_HERE

在AppDelegate.swift文件的顶部:

代码语言:javascript
复制
import CoreData

在AppDelegate.swift文件的底部,在结束的花括号之前:

代码语言:javascript
复制
// MARK: - Core Data stack

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.
        self.saveContext()
    }

lazy var persistentContainer: NSPersistentContainer = {
    /*
     The persistent container for the application. This implementation
     creates and returns a container, having loaded 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.
    */
    let container = NSPersistentContainer(name: "YOUR_APP_NAME_HERE")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() 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.

            /*
             Typical reasons for an error here include:
             * The parent directory does not exist, cannot be created, or disallows writing.
             * The persistent store is not accessible, due to permissions or data protection when the device is locked.
             * The device is out of space.
             * The store could not be migrated to the current model version.
             Check the error message to determine what the actual problem was.
             */
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

// MARK: - Core Data Saving support

func saveContext () {
    let context = persistentContainer.viewContext
    if context.hasChanges {
        do {
            try context.save()
        } catch {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() 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
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}
票数 21
EN

Stack Overflow用户

发布于 2018-06-07 21:20:26

我知道这个问题已经得到了回答,但我相信真正的问题出在苹果的文档上。如果您将Objective-C代码与Swift代码进行比较,您会发现var managedObjectContext: NSManagedObjectContext实际上并没有定义。您应该将该行替换为var persistentContainer: NSPersistentContainer。这是Objective-c接口。

代码语言:javascript
复制
@interface MyDataController : NSObject
@property (strong, nonatomic, readonly) NSPersistentContainer *persistentContainer; 
- (id)initWithCompletionBlock:(CallbackBlock)callback;
@end

所以DataController.swift应该是:

代码语言:javascript
复制
class DataController: NSObject {
 // Delete this line   var managedObjectContext: NSManagedObjectContext
    var persistentContainer: NSPersistentContainer
    init(completionClosure: @escaping () -> ()) {
        persistentContainer = NSPersistentContainer(name: "DataModel")
        persistentContainer.loadPersistentStores() { (description, error) in
          if let error = error {
              fatalError("Failed to load Core Data stack: \(error)")
          }
          completionClosure()
       }
    }
}

至于剩下的代码,就不需要Apple Docs了。

在iOS 10和macOS 10.12之前,核心数据堆栈的创建涉及更多

这段代码向您展示了老方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48723979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档