如何从由应用程序扩展程序更新的sqlite文件中重新加载CoreData的数据在主应用程序中?

时间:2019-05-04 02:14:18

标签: ios swift iphone xcode core-data

我在这种情况下:

  1. 我的应用程序扩展名(共享扩展名)使用CoreData和存储在app group共享目录中的CoreData的SQLite文件插入新条目。
  2. 切换回主应用程序时,主上下文不会更新。

我使用了CoreDataStack.shared.mainContext.reset(),但是它不起作用。

我的核心堆栈核心(我的主应用程序和应用程序扩展名均使用此代码):

import CoreData

public class CoreDataStack {

    let appID = "xxx"
    let modelFileName = "xxx"
    let defaultAppGroupID = "xxx"

    public static let shared = CoreDataManager()

    public var mainContext: NSManagedObjectContext {
        return mainPersistentContainer.viewContext
    }
    // MARK: - Core Data stack

    lazy var managedObjectModel: NSManagedObjectModel = {
        let bundle = Bundle(for: type(of: self))
        let momdURL = bundle.url(forResource: modelFileName, withExtension: "momd")!
        return NSManagedObjectModel(contentsOf: momdURL)!
    }()

    lazy var mainPersistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: modelFileName, managedObjectModel: managedObjectModel)

        container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: defaultAppGroupID)!.appendingPathComponent("\(modelFileName).sqlite"))]

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

        return container
    }()

    public func saveMainContext() {
        let context = mainPersistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }

    fileprivate func applicationDocumentsDirectory() -> URL {
        let fileManager = FileManager.default

        if let url = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.io.wildcat.InfoFlow") {
            return url
        } else {
            let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
            return urls[0]
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我提交了代码级支持,这是答案。

您可以考虑两种解决方法:

  1. 当主应用回到前台时,从存储中重新加载数据。之后,重新加载数据。
context.reset()
// MARK: Reload the data
// NSFetchedResultsController.performFetch()
// UITableView.reloadData()
  1. 持久历史记录跟踪(在WWDC 19中也得到了增强)。参考:https://stoeffn.de/posts/persistent-history-tracking-in-core-data/