将数据从Core Data加载到Today Widget
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将数据从Core Data加载到Today Widget相关的知识,希望对你有一定的参考价值。
我有用Swift编写的ios应用程序,可与Core Data配合使用。不,我想获取Core Data中存在的最后一条记录,并将其显示在Today Widget Extension中。
- 我在项目中添加了新的小部件目标
- 在我的coredata.xcdatamodeld中,我还检查了扩展的目标成员资格
- 对于这两个目标(应用程序和扩展程序),我添加并启用了专门创建的App Group group.myapp.sharingForTodayExtension
- 这是来自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)
}}
问题是它显示记录计数= 0
答案
当您更改defaultDirectoryURL
返回的值时,您将更改持久性存储文件的位置。应用程序在此更改之前已有的任何数据仍应存在,但在旧位置。
如果您需要保持对现有数据的访问权限并将数据提供给应用程序和扩展程序,则需要将旧数据移动到新的共享位置。
你可以通过几种方式实现这一目标。
- 使用
NSPersistentStoreCoordinator
在应用程序中加载旧数据,然后使用其migratePersistentStore(_:to:options:withType:)
方法将数据移动到新的持久性存储。 - 使用
FileManager
移动文件。除了主持久存储文件之外,还要确保获取两个日志文件。如果您具有允许外部存储的二进制属性,则这可能很棘手。 - 创建两个
NSPersistentContainer
实例,一个用于旧位置,另一个用于新实例,并编写自己的代码以从一个读取对象并在另一个中创建重复项。
以上是关于将数据从Core Data加载到Today Widget的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Today Extension (iOS 8) 访问 Core Data/CloudKit
将 Core Data 数据库从一个应用程序迁移到另一个应用程序
Core Data iOS 8 Today Widget 问题