我用Swift编写的iOS应用程序可以处理核心数据。
不,我希望得到核心数据中存在的最后一条记录,并将其显示在今天的小部件扩展中。
我在我的项目中添加了新的小部件目标
在coredata.xcdatamodeld中,我还检查了扩展的目标成员身份
对于两个目标(应用程序和扩展),我添加并启用了专门创建的应用程序组Group.myapp.sharingForTodayExtension
这是我今天的代码

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

问题是它显示记录计数=0

最佳答案

当您更改defaultDirectoryURL返回的值时,您将更改持久存储文件的位置。在此更改之前,应用程序已经拥有的任何数据都应该仍然存在,但位于旧位置。
如果您需要访问现有数据,并将数据提供给应用程序和扩展,则需要将旧数据移动到新的共享位置。
你可以用几种方法做到这一点。
使用NSPersistentStoreCoordinator加载应用程序中的旧数据,然后使用其migratePersistentStore(_:to:options:withType:)方法将数据移动到新的持久存储。
使用FileManager移动文件。除了主持久存储文件外,请确保同时获取这两个日志文件。如果有允许外部存储的二进制属性,这可能会很棘手。
创建两个NSPersistentContainer实例,一个用于旧位置,另一个用于新位置,然后编写自己的代码从一个实例读取对象,并在另一个实例中创建副本。

10-08 05:57
查看更多