【问题标题】:fetching from Coredata in ios app widget extension in ios 10在 ios 10 的 ios 应用小部件扩展中从 Coredata 获取
【发布时间】:2016-12-10 12:40:57
【问题描述】:

我正在尝试从我的主应用程序的 coredata 数据库中获取实体并将它们显示在我的应用程序小部件扩展中。但是,提取总是从我的数据库返回一个空结果。谁能帮帮我。斯威夫特 3,iOS 10。

【问题讨论】:

  • 这是一个非常广泛的问题,可能存在许多问题。有错误信息吗?数据库是空的吗?你能显示一些代码吗?
  • 您必须使用“应用程序组”(谷歌搜索)为应用程序和扩展程序使用共享目录。
  • 是的,我能够为应用程序创建应用程序组,但我无法访问 ios 10 API 的 coredata 目录。 ios 9 核心数据堆栈在 appdelegate 中有一个用于访问数据库文档目录的方法,但是对于新的 ios 10 核心数据堆栈,该方法已被删除,我很难访问我的核心数据库的目录以共享我的应用程序组的组件之间的目录。有什么帮助吗?
  • 这个答案工作正常:Answer

标签: swift3 ios10 today-extension


【解决方案1】:

我解决了。创建 App Group 后,我创建了 NSPersistentContainer 的子类并重写类方法 defaultDirectory() 以返回共享的应用程序组目录。还要覆盖 init(name: String, managedObjectModel model: NSManagedObjectModel)。然后在 coredata 堆栈中,将样板持久容器代码替换为创建的 PersistentContainer 类的新实例。

import UIKit
import CoreData
class PersistentContainer: NSPersistentContainer{
     override class func defaultDirectoryURL() -> URL{
    return FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.bundleId.SomeApp")!
}

override init(name: String, managedObjectModel model: NSManagedObjectModel) {
    super.init(name: name, managedObjectModel: model)
}
}

然后在 CoreDataStack 代码中 *可能在 Appdelegate 或它自己的文件中。我在自己的名为 CoredataStack 的文件中

static var persistentContainer:PersistentContainer = {
    let container = PersistentContainer(name: "SomeApp", managedObjectModel: CoreDataStack.managedObjectModel)
    container.loadPersistentStores(completionHandler: { (storeDescription:NSPersistentStoreDescription, error:Error?) in
        if let error = error as NSError?{
            fatalError("UnResolved error \(error), \(error.userInfo)")
        }
    })

    return container
}()

希望对你有帮助

【讨论】:

  • 希望对您有所帮助
  • 谢谢!还有一个问题。现在核心数据堆栈已保存到共享应用程序组目录中,您如何实际从扩展中获取实体?我遇到了麻烦,因为我尝试的代码依赖于 AppDelegate 而扩展程序没有。
  • 您可以考虑将 Appdelegate.swift 文件作为扩展目标成员的一部分,但这不是一个好的编码习惯。更好的方法是将所有 coredata 方法移动到一个独立文件中,然后通过使用目标成员窗格将 coredata 文件设置为两者的目标成员,使主应用程序和扩展都可以访问该文件。
  • @cod_A 这是一个单例文件吗?应用程序和扩展是否会真正共享一个 NSPersistentContainer,具有共同的 persistentStore、persistentStoreController 和 managedObjectContext?
  • 是的,它将是一个单例文件,是的,应用程序和扩展程序将共享相同的核心数据存储,假设扩展程序的目的是显示来自基本应用程序的数据。
【解决方案2】:

Today Extension 在与其包含的应用程序不同的进程中运行,因此不共享沙箱、UserDefaults 或数据库表。这就是为什么在尝试从小部件中获取保存在容器中的数据时会得到一个空集的原因。 如果您希望包含的应用程序和小部件共享数据,您应该通过 iOS 开发人员门户向您的应用程序添加“应用程序组”功能,并为其提供一个共享组标识符字符串。 接下来,当您为数据库(或 UserDefaults)实例化 FileManager 对象时,您必须使用 initWithSuiteName 方法,传入共享组的标识符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多