user1046037
user1046037

Reputation: 17685

Access Core Data Model inside a framework

Overview:

I have a workspace containing the following structure:

Workspace:

-- SomeApp
-- SomeFramework
---- DataService.swift
---- FrameworkModel.xcdatamodeld

SomeFramework has been added (Embeded & Sign) to SomeProject.

Current Behaviour:

Questions:

DataService.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"
    }
}

Upvotes: 4

Views: 751

Answers (1)

user1046037
user1046037

Reputation: 17685

Need to specify the framework bundleID and model name:

Solution:

    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
        }()

Reference:

Big thanks to https://medium.com/@yoellev8/sharing-a-core-data-model-with-a-swift-framework-5d191ccec99e

Upvotes: 11

Related Questions