Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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:

  • The app is crashing when I try to print persistentContainer.viewContext
  • There is no Sqlite file being created.
  • However I am able to access other classes defined in the SomeFramework

Questions:

  • How can I access the DataModel defined in the framework?

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"
    }
}
like image 683
user1046037 Avatar asked Oct 20 '25 05:10

user1046037


1 Answers

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

like image 127
user1046037 Avatar answered Oct 21 '25 20:10

user1046037