Core data 具有多个目标的核心数据框架

Core data 具有多个目标的核心数据框架,core-data,frameworks,swift4,Core Data,Frameworks,Swift4,我目前正在swift 4中制作一个项目,其中使用了一些目标。由于所有目标都需要访问相同的核心数据,因此我决定创建自己的框架目标,该框架目标存储数据模型以及访问信息 我遇到的问题是在我的应用程序目标(CoreDataTest)中,当我运行应用程序时,我得到以下错误: 2017-09-17 12:02:20.787132+0100 CoreDataTest[22070:3218298] [error] error: Failed to load model named TestData CoreD

我目前正在swift 4中制作一个项目,其中使用了一些目标。由于所有目标都需要访问相同的核心数据,因此我决定创建自己的框架目标,该框架目标存储数据模型以及访问信息

我遇到的问题是在我的应用程序目标(CoreDataTest)中,当我运行应用程序时,我得到以下错误:

2017-09-17 12:02:20.787132+0100 CoreDataTest[22070:3218298] [error] error:  Failed to load model named TestData
CoreData: error:  Failed to load model named TestData
2017-09-17 12:02:20.787594+0100 CoreDataTest[22070:3218298] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An NSManagedObject of class 'Message' must have a valid NSEntityDescription.'
*** First throw call stack:
(0x182097d38 0x1815ac528 0x18481a73c 0x1026c6678 0x1026c6708 0x1848bac5c 0x10261d480 0x10261ce94 0x10261cd48 0x10261cecc 0x18b42b96c 0x18b42b544 0x18b43210c 0x18b42f378 0x18b49edb4 0x18b68e570 0x18b693300 0x18b9129b4 0x18bbd90d0 0x18b912618 0x18b912e88 0x18c05daf4 0x18c05d998 0x18bde7ab4 0x18bf77c94 0x18bde7964 0x18bbd8730 0x18b691a44 0x18ba80144 0x18472d968 0x184736270 0x10344145c 0x10344db74 0x184761b04 0x1847617a8 0x184761d44 0x182040358 0x1820402d8 0x18203fb60 0x18203d738 0x181f5e2d8 0x183de3f84 0x18b48f5e0 0x10261deec 0x181a8256c)
libc++abi.dylib: terminating with uncaught exception of type NSException
我添加了一个异常断点,它在
ViewController.swift
PersistenceStorage.saveContext()中崩溃

如何创建一个框架,在单个项目的多个目标中创建共享的核心数据数据库

这是我的项目设置。请注意,每个小组都有自己的目标

目标:CoreDataKit(框架)
CoreData.swift

import CoreData

public class PersistenceStorage {

    private init() {}

    public static var context: NSManagedObjectContext {
        return persistentContainer.viewContext
    }


    public static var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "TestData")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()


    public static func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }
}
Message+CoreDataClass.swift

import Foundation
import CoreData

@objc(Message)
public class Message: NSManagedObject {

}
Message+CoreDataProperties.swift

import Foundation
import CoreData


extension Message {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Message> {
        return NSFetchRequest<Message>(entityName: "Message")
    }

    @NSManaged public var text: String?

}
AppDelegate.swift

import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

}

经过大量研究和反复试验,我发现我需要将xcdatamodel文件上的目标成员设置为我希望与之共享的其他目标


经过大量研究和反复试验,我发现我需要将xcdatamodel文件上的目标成员设置为我希望与之共享的其他目标


我自己也遇到了这个问题,所以我想我应该发布一些其他的选择

因为您不是NSPersistentContainer的子类,所以它不知道在哪里查找捆绑包,所以除了查找主捆绑包之外别无选择


如果您只想在框架中拥有您的模型,那么您可以将NSPersistentContainer子类化,或者您可以首先加载模型并将其传递给持久容器的初始化。如果您只有一个模型,那么执行类似mergedModelFromBundles的操作非常简单,然后将该模型传递给持久化容器初始值设定项

我自己刚碰到这个,所以我想我会发布一些其他的选择

因为您不是NSPersistentContainer的子类,所以它不知道在哪里查找捆绑包,所以除了查找主捆绑包之外别无选择

如果您只想在框架中拥有您的模型,那么您可以将NSPersistentContainer子类化,或者您可以首先加载模型并将其传递给持久容器的初始化。如果您只有一个模型,那么执行类似mergedModelFromBundles的操作非常简单,然后将该模型传递给持久化容器初始值设定项

import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

}