【问题标题】:Initialize NSPersistentStore object初始化 NSPersistentStore 对象
【发布时间】:2017-05-27 21:22:20
【问题描述】:

Swift 版本:swift3.0 目标iOS版本:10.0

我尝试为涉及核心数据的函数编写单元测试。所以我要做的第一件事就是用 NSPersistentStore 类型初始化类变量。

这是我的类变量代码

class DataProviderTests: XCTestCase {
    var storeCoordinator: NSPersistentStoreCoordinator!
    var managedObjectContext: NSManagedObjectContext!
    var managedObjectModel: NSManagedObjectModel!
    var store: NSPersistentStore!
    .....
}

下面是初始化类变量的设置函数

override func setUp() {
    super.setUp()

    managedObjectModel = NSManagedObjectModel.mergedModelFromBundles(nil)
    storeCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
    do{
        try store = storeCoordinator.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil)
    }catch let error as NSError{
        print(error)
        store = nil
    }
    .....
}

但问题是 Xcode 一直抱怨这个类没有初始化器。

Swift Compiler Error: Class 'DataProviderTests' has no initializers

我发现“存储”变量未正确初始化。

但是 addPersistanteStoreWithtype() 函数会抛出错误,我应该使用 try 和 catch 子句。但它会导致这个问题..

初始化存储类变量以解决问题的最佳方法是什么?

感谢您的帮助

【问题讨论】:

  • 请发布当前正在发生的实际错误以及发生在哪一行。另外,请告诉我们目标 iOS 版本。
  • @androisojavaswift - 请参阅我修改后的答案。如果您对我有任何问题,请发表评论。

标签: ios swift xcode core-data swift3


【解决方案1】:

这是一个适合我的 try - catch 执行示例:

func getDocumentsURL() -> URL {
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    return documentsURL
}

var modelUrl: URL? // This would be the unique URL for your data model

let storeUrl:URL = getDocumentsURL().appendingPathComponent("<YOURNAME.sqlite>") // Make sure to update with your project name or whatever your sqlite filename is

var persistentStoreCoordinator: NSPersistentStoreCoordinator!

var store: NSPersistentStore!

var error: Error? // Use to handle error in case of failure

if let modelAtUrl = NSManagedObjectModel(contentsOf: modelUrl) {

     managedObjectModel = modelAtUrl

     persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)

     let options = [
         NSMigratePersistentStoresAutomaticallyOption: true,
         NSInferMappingModelAutomaticallyOption: true
     ]

     managedObjectContext = NSManagedObjectContext(concurrencyType: concurrencyType)
     managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator

     do {
         try store = self.persistentStoreCoordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: storeUrl, options: options)
        } catch let error as Error {
         print("Unable to initialize persistent store coordinator:", error)
         self.error = error
     } catch {
         fatalError()
     }

} else {
     fatalError("Error initializing managed object model from URL: \(modelUrl)")
}

【讨论】:

  • 如果您尝试使用它,请检查更新。我添加了更多关于如何正确分配 storeUrl 属性的说明,并通过使用 Error 而不是 NSError 为 Swift 3 进行了更新。
  • 感谢您的代码,但我尝试实现的是初始化类变量“var store: NSPersistentStore!”,它应该使用 addPersistentStoreWithType() 返回的新存储对象进行初始化。在单元测试中,setup() 与 init() 相同。此外,由于它是用于测试,我实际上并不需要创建真正的商店对象,但我尝试创建假的用于测试目的,这就是为什么我使用“NSInMemoryStoreType”值作为商店类型的原因。
  • @androisojavaswift - 查看更新的答案。你说do{ try store = self.persistentStoreCoordinator之后就可以初始化store变量了
  • @androisojavaswift - 还将NSInMemoryStoreType 添加到持久存储类型中。
猜你喜欢
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多