Access Core Data Model inside a framework

use*_*037 3 core-data ios swift

Overview:

我有一个包含以下结构的工作区:

工作空间:

-- SomeApp
-- SomeFramework
---- DataService.swift
---- FrameworkModel.xcdatamodeld
Run Code Online (Sandbox Code Playgroud)

SomeFramework 已添加(嵌入并签名)到 SomeProject。

目前的行为:

  • 当我尝试打印时应用程序崩溃persistentContainer.viewContext
  • 没有创建 Sqlite 文件。
  • 但是我可以访问中定义的其他类SomeFramework

问题:

  • 如何访问框架中定义的DataModel?

数据服务.swift:

import Foundation
import CoreData

public class DataService {
    
    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "FrameworkModel")
        container.loadPersistentStores { description, error in
            if let error = error {
                fatalError("Unable to load persistent stores: \(error)")
            }
        }
        return container
    }()
    
    public init() {
        
        print(persistentContainer.viewContext) //Crashes here because "Failed to load model named FrameworkModel"
    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*037 9

需要指定框架bundleID和型号名称:

解决方案:

    let frameworkBundleID   = "com.frameworkBundleID"
    let modelName           = "FrameworkModel"

    lazy var persistentContainer: NSPersistentContainer = {
        
            let frameworkBundle = Bundle(identifier: self.frameworkBundleID)
            let modelURL = frameworkBundle!.url(forResource: self.modelName, withExtension: "momd")!
            let managedObjectModel =  NSManagedObjectModel(contentsOf: modelURL)
            
            let container = NSPersistentContainer(name: self.modelName, managedObjectModel: managedObjectModel!)
            container.loadPersistentStores { storeDescription, error in
                
                if let error = error {
                    fatalError("Unable to load persistent stores: \(error)")
                }
            }
            
            return container
        }()
Run Code Online (Sandbox Code Playgroud)

参考:

非常感谢https://medium.com/@yoellev8/sharing-a-core-data-model-with-a-swift-framework-5d191ccec99e