gpt4 book ai didi

swift - 将数据从 Core Data 加载到 Today Widget

转载 作者:行者123 更新时间:2023-11-28 06:06:52 27 4
gpt4 key购买 nike

我有一个用 Swift 编写的 iOS 应用程序,可以与 Core Data 一起使用。不,我想获取 Core Data 中存在的最后一条记录,并将其呈现在 Today Widget Extension 中。

  1. 我向我的项目添加了新的小部件目标
  2. 在我的 coredata.xcdatamodeld 中,我还检查了目标成员资格以进行扩展
  3. 对于这两个目标(应用程序和扩展程序),我添加并启用了专门创建的应用程序组 group.myapp.sharingForTodayExtension
  4. 这是我在 TodayViewController 中的代码

    import UIKit
    import NotificationCenter
    import CoreData

    class TodayViewController: UIViewController, NCWidgetProviding {

    var managedObjectContext : NSManagedObjectContext?

    override func viewDidLoad() {
    super.viewDidLoad()

    let container = PersistentContainer(name: "containerName")
    container.loadPersistentStores { (storeDesc, error) in
    if let error = error {
    print("Widget Core Data loading error.... \(error)")
    return
    }

    print("loaded fine")
    self.managedObjectContext = container.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "appEntities")

    if let fetchResults = (try? self.managedObjectContext?.fetch(fetchRequest)) as? [myCoreDataObjectType] {
    print("records count = \(fetchResults.count)")
    }

这里是 PersistentContainer 的特殊类

class PersistentContainer: NSPersistentContainer{
override class func defaultDirectoryURL() -> URL{
return FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.myapp.sharingForTodayExtension")!
}

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

问题是它显示records count = 0

最佳答案

当您更改 defaultDirectoryURL 返回的值时,您会更改持久存储文件的位置。您的应用在此更改之前已经拥有的任何数据应该仍然存在,但位于旧位置。

如果您需要保留对现有数据的访问权限并让应用和扩展都可以使用这些数据,则需要将旧数据移动到新的共享位置。

您可以通过几种方式做到这一点。

  • 使用 NSPersistentStoreCoordinator 在应用程序中加载旧数据,然后使用其 migratePersistentStore(_:to:options:withType:) 方法将数据移动到新的持久化商店。
  • 使用 FileManager 移动文件。确保除了主持久存储文件之外还获取两个日志文件。如果您有允许外部存储的二进制属性,这可能会很棘手。
  • 创建两个 NSPersistentContainer 实例,一个用于旧位置,一个用于新位置,并编写您自己的代码以从一个读取对象并在另一个创建副本。

关于swift - 将数据从 Core Data 加载到 Today Widget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47931158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com