Core Data在首次启动时将数据保存到错误的数据库中

时间:2017-05-04 15:07:09

标签: ios swift core-data

我有一个带有两个配置的DataModel。一个用于预加载数据,另一个用于用户数据。 首次启动时,预加载SQLLite数据库将复制到Documents文件夹。用户数据数据库由ApplicationSupport目录中的Core Data创建。到目前为止一切正常。但现在问题是:如果是第一次启动,即使已调用saveContext()方法,也不会保存任何内容。所有用户数据都在下一个应用程序启动时消失。但它不是第一次启动,一切正常,所有用户数据都在下一个应用程序启动时出现。有谁知道问题是什么?这是我的核心数据堆栈:

    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "CoreData_App")

        container.persistentStoreDescriptions[0].configuration = "PreloadData"
        container.persistentStoreDescriptions[0].url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("PreloadData.sqlite")

        let userStoreDescription = NSPersistentStoreDescription(url: FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!.appendingPathComponent("UserData.sqlite"))
        userStoreDescription.configuration = "UserData"

        container.persistentStoreDescriptions.append(userStoreDescription)


        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    // MARK: - Core Data Saving support

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

修改 经过大量测试后,我发现数据在第一次启动时存储在预加载数据库中,在第二次启动时正确地存储在用户数据数据库中。但我想在用户数据库的第一次启动时保存数据。这里是我保存数据的代码:



@IBAction func pressedFavoriteButton(_ sender: UIButton) {
        if userRating == nil {
            let rating = UserRating(context: DataController.sharedInstance.persistentContainer.viewContext)
            rating.entryID = (entry?.id)!
            userRating = rating
        }

        apiHandler.sendRequest(.POST) { (response, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            DispatchQueue.main.async {
                self.userRating?.isFavorite = !self.favoriteButton.isSelected
                self.favoriteButton.isSelected = !self.favoriteButton.isSelected
                
               DataController.sharedInstance.saveContext()
            }
        }
    }




1 个答案:

答案 0 :(得分:0)

首先让我们正确设置商店,

let preloadDataStoreDescription = NSPersistentStoreDescription(url: FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("PreloadData.sqlite"))

let userStoreDescription = NSPersistentStoreDescription(url: FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!.appendingPathComponent("UserData.sqlite"))

    userStoreDescription.configuration = "UserData"
preloadDataStoreDescription.configuration = "PreloadData"

container.persistentStoreDescriptions = [preloadDataStoreDescription, userStoreDescription]

由于您有2个数据库,因此它取决于您要存储的实体。

如果实体属于Preload配置,它将存储在preload数据库中,否则它将存储在用户数据库中。

P.S。 您还可以使用标志

进一步调试
-com.apple.CoreData.SQLDebug 1
编辑方案中的

>参数>启动时传递的参数

另外,如果不是真的需要,我建议不要将设计与2个数据库复杂化。