使用 Swift 从库中获取 CoreData 中的 nil managedObjectContext
Getting nil managedObjectContext in CoreData with Swift working from a Library
我正在使用 Swift 5 为 iOS 开发一个库,我希望这个库使用独立于使用该库的应用程序的 CoreData,这就是我所做的远:
- 创建了具有各自数据类型的实体
- 创建了
.xcdatamodeld
文件,其中包含实体
- 创建了一个如下所示的
CoreDataManager
:
// MARK: - CoreDataManager
final class CoreDataManager {
static let shared = CoreDataManager()
private static let defaultObject = NSManagedObject.init()
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "Audit")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
}
问题是我试图通过以下方式获取上下文:
let coreDataManager = CoreDataManager.shared
let context = coreDataManager.persistentContainer.viewContext
和 context
返回 nil
请帮忙
我解决了它,显然问题是我想使用我的库的 ios 应用程序找不到 .xcdatamodeld
文件这导致了一个无用的 NSPersistentContainer
对象,这也意味着 let context = persistentContainer.viewContext
是 nil
.
为了避免将来出现此类麻烦,我将列出使用 CoreData 和 swift 库时的重要注意事项。
需要考虑的关键事项
- 确保正在使用您的库的应用知道确切位置
寻找它。可能想看看 this article for details.
- 如果您使用 cocoapods 来分发您的库,请确保将以下内容添加到您的 .podspec 中:
s.resources = "path/to/model.xcdatamodeld"
这将在您的 Pods 目标中生成一个名为“Resources”的文件夹:
- 确保您的模型文件名与
NSPersistentContainer
名称匹配。
- (不确定) 我更改了我的 NSManagedObjects 的 class 定义
class Audit: NSManagedObject {}
至
public class Audit: NSManagedObject {}
即使我不确定这是否有意义,它也可能对您有用。
最后我会留下对我有用的代码
// MARK: - CoreDataManager
final class CoreDataManager {
static let shared = CoreDataManager()
private static let defaultObject = NSManagedObject.init()
lazy var persistentContainer: NSPersistentContainer? = {
let modelURL = Bundle(for: Audit.self).url(forResource: "Audit", withExtension: "momd")
guard let model = modelURL.flatMap(NSManagedObjectModel.init) else {
print("Fail to load the trigger model!")
return nil
}
let container = NSPersistentContainer(name: "Audit", managedObjectModel: model)
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
}
并获取外部上下文
let coreDataManager = CoreDataManager.shared
guard
let context = coreDataManager.persistentContainer?.viewContext
else {
print("Nil context case")
return
}
希望对大家有所帮助!!
我正在使用 Swift 5 为 iOS 开发一个库,我希望这个库使用独立于使用该库的应用程序的 CoreData,这就是我所做的远:
- 创建了具有各自数据类型的实体
- 创建了
.xcdatamodeld
文件,其中包含实体 - 创建了一个如下所示的
CoreDataManager
:
// MARK: - CoreDataManager
final class CoreDataManager {
static let shared = CoreDataManager()
private static let defaultObject = NSManagedObject.init()
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "Audit")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
}
问题是我试图通过以下方式获取上下文:
let coreDataManager = CoreDataManager.shared
let context = coreDataManager.persistentContainer.viewContext
和 context
返回 nil
请帮忙
我解决了它,显然问题是我想使用我的库的 ios 应用程序找不到 .xcdatamodeld
文件这导致了一个无用的 NSPersistentContainer
对象,这也意味着 let context = persistentContainer.viewContext
是 nil
.
为了避免将来出现此类麻烦,我将列出使用 CoreData 和 swift 库时的重要注意事项。
需要考虑的关键事项
- 确保正在使用您的库的应用知道确切位置 寻找它。可能想看看 this article for details.
- 如果您使用 cocoapods 来分发您的库,请确保将以下内容添加到您的 .podspec 中:
s.resources = "path/to/model.xcdatamodeld"
这将在您的 Pods 目标中生成一个名为“Resources”的文件夹:
- 确保您的模型文件名与
NSPersistentContainer
名称匹配。 - (不确定) 我更改了我的 NSManagedObjects 的 class 定义
class Audit: NSManagedObject {}
至
public class Audit: NSManagedObject {}
即使我不确定这是否有意义,它也可能对您有用。
最后我会留下对我有用的代码
// MARK: - CoreDataManager
final class CoreDataManager {
static let shared = CoreDataManager()
private static let defaultObject = NSManagedObject.init()
lazy var persistentContainer: NSPersistentContainer? = {
let modelURL = Bundle(for: Audit.self).url(forResource: "Audit", withExtension: "momd")
guard let model = modelURL.flatMap(NSManagedObjectModel.init) else {
print("Fail to load the trigger model!")
return nil
}
let container = NSPersistentContainer(name: "Audit", managedObjectModel: model)
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
}
并获取外部上下文
let coreDataManager = CoreDataManager.shared
guard
let context = coreDataManager.persistentContainer?.viewContext
else {
print("Nil context case")
return
}
希望对大家有所帮助!!