将数据从Core Data加载到Today Widget

时间:2017-12-21 18:58:59

标签: swift core-data today-extension ios10-today-widget

我使用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)")
        }
    
  5. 这里是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

1 个答案:

答案 0 :(得分:1)

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

如果您需要保持对现有数据的访问权限并且该数据可用于应用和扩展程序,则需要将旧数据移至新的共享位置。

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

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