Core data 如何在WidgetKit中显示核心数据中的数据
这是我的代码,我试图在WidgetKit中列出核心数据中存储的数据,但它根本没有显示出来。我已经创建了应用程序组,数据会在预览时显示,但当我们将小部件添加到主屏幕时,什么都不会显示。我不确定我的做法是否正确 在WidgetKit中列出核心数据记录的最佳方式是什么Core data 如何在WidgetKit中显示核心数据中的数据,core-data,swiftui,ios14,widgetkit,Core Data,Swiftui,Ios14,Widgetkit,这是我的代码,我试图在WidgetKit中列出核心数据中存储的数据,但它根本没有显示出来。我已经创建了应用程序组,数据会在预览时显示,但当我们将小部件添加到主屏幕时,什么都不会显示。我不确定我的做法是否正确 在WidgetKit中列出核心数据记录的最佳方式是什么 import WidgetKit import SwiftUI import CoreData // MARK: For Core Data public extension URL { /// Returns a URL
import WidgetKit
import SwiftUI
import CoreData
// MARK: For Core Data
public extension URL {
/// Returns a URL for the given app group and database pointing to the sqlite database.
static func storeURL(for appGroup: String, databaseName: String) -> URL {
guard let fileContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroup) else {
fatalError("Shared file container could not be created.")
}
return fileContainer.appendingPathComponent("\(databaseName).sqlite")
}
}
var managedObjectContext: NSManagedObjectContext {
return persistentContainer.viewContext
}
var workingContext: NSManagedObjectContext {
let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
context.parent = managedObjectContext
return context
}
var persistentContainer: NSPersistentCloudKitContainer = {
let container = NSPersistentCloudKitContainer(name: "Countdowns")
let storeURL = URL.storeURL(for: "group.app-group-countdowns", databaseName: "Countdowns")
let description = NSPersistentStoreDescription(url: storeURL)
container.loadPersistentStores(completionHandler: { storeDescription, error in
if let error = error as NSError? {
print(error)
}
})
container.viewContext.automaticallyMergesChangesFromParent = true
container.viewContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
return container
}()
// MARK: For Widget
struct Provider: TimelineProvider {
var moc = managedObjectContext
init(context : NSManagedObjectContext) {
self.moc = context
}
func placeholder(in context: Context) -> SimpleEntry {
return SimpleEntry(date: Date())
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date())
return completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
var entries: [SimpleEntry] = []
let currentDate = Date()
let entryDate = Calendar.current.date(byAdding: .minute, value: 1, to: currentDate)!
let entry = SimpleEntry(date: entryDate)
entries.append(entry)
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
}
struct SimpleEntry: TimelineEntry {
let date: Date
}
struct CountdownsWidgetEntryView : View {
var entry: Provider.Entry
@FetchRequest(entity: Countdown.entity(), sortDescriptors: []) var countdowns: FetchedResults<Countdown>
var body: some View {
return (
VStack {
ForEach(countdowns, id: \.self) { (memoryItem: Countdown) in
Text(memoryItem.title ?? "Default title")
}.environment(\.managedObjectContext, managedObjectContext)
Text(entry.date, style: .time)
}
)
}
}
@main
struct CountdownsWidget: Widget {
let kind: String = "CountdownsWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider(context: managedObjectContext)) { entry in
CountdownsWidgetEntryView(entry: entry)
.environment(\.managedObjectContext, managedObjectContext)
}
.configurationDisplayName("My Widget")
.description("This is an example widget.")
}
}
struct CountdownsWidget_Previews: PreviewProvider {
static var previews: some View {
CountdownsWidgetEntryView(entry: SimpleEntry(date: Date()))
.previewContext(WidgetPreviewContext(family: .systemSmall))
}
}
导入WidgetKit
导入快捷键
导入CoreData
//标记:用于核心数据
公共扩展URL{
///返回指向sqlite数据库的给定应用程序组和数据库的URL。
静态func storeURL(对于appGroup:String,databaseName:String)->URL{
guard let fileContainer=FileManager.default.containerURL(用于安全应用程序组标识符:appGroup)else{
fatalError(“无法创建共享文件容器”)
}
返回fileContainer.appendingPathComponent(“\(数据库名).sqlite”)
}
}
var managedObjectContext:NSManagedObjectContext{
返回persistentContainer.viewContext
}
var workingContext:NSManagedObjectContext{
let context=NSManagedObjectContext(并发类型:.privateQueueConcurrencyType)
context.parent=managedObjectContext
返回上下文
}
var persistentContainer:NSPersistentCloudKitContainer={
let container=NSPersistentCloudKitContainer(名称:“倒计时”)
让storeURL=URL.storeURL(用于:“group.app组倒计时”,数据库名称:“倒计时”)
let description=NSPersistentStoreDescription(url:storeURL)
loadPersistentStores(completionHandler:{storeDescription,中出现错误
如果let error=错误为N错误{
打印(错误)
}
})
container.viewContext.automaticallyMergesChangesFromParent=true
container.viewContext.mergePolicy=NSMergeByPropertyStoreTranpMergePolicy
返回容器
}()
//马克:小部件
结构提供程序:TimelineProvider{
var moc=managedObjectContext
init(上下文:NSManagedObjectContext){
self.moc=上下文
}
func占位符(在上下文中:context)->SimpleEntry{
返回SimpleEntry(日期:date())
}
func getSnapshot(在上下文:context中,完成:@escaping(SimpleEntry)->()){
let entry=SimpleEntry(日期:date())
返回完成(条目)
}
func getTimeline(在上下文中:上下文,完成:@escaping(Timeline)->()){
变量项:[SimpleEntry]=[]
让currentDate=Date()
让entryDate=Calendar.current.date(通过添加:。分钟,值:1,到:currentDate)!
let entry=SimpleEntry(日期:entryDate)
条目。追加(条目)
let timeline=timeline(条目:条目,策略:.atEnd)
完成(时间表)
}
}
结构SimpleEntry:TimelineEntry{
日期:日期
}
结构CountdownsWidgetEntryView:视图{
var条目:Provider.entry
@FetchRequest(实体:Countdown.entity(),sortDescriptors:[])变量倒计时:FetchedResults
var body:一些观点{
返回(
VStack{
中的ForEach(倒计时,id:\.self){(memoryItem:Countdown)
文本(memoryItem.title??“默认标题”)
}.environment(\.managedObjectContext,managedObjectContext)
文本(entry.date,style.time)
}
)
}
}
@主要
结构CountdownsWidget:Widget{
let kind:String=“CountdownsWidget”
变量主体:一些WidgetConfiguration{
静态配置(种类:种类,提供程序:提供程序(上下文:managedObjectContext)){
CountdownsWidgetEntryView(条目:条目)
.environment(\.managedObjectContext,managedObjectContext)
}
.configurationDisplayName(“我的小部件”)
.description(“这是一个示例小部件”)
}
}
结构CountdownsWidget\u预览:PreviewProvider{
静态var预览:一些视图{
CountdownsWidgetEntryView(条目:SimpleEntry(日期:date()))
.previewContext(WidgetPreviewContext(系列:.systemSmall))
}
}
只需在托管对象上下文上调用execute&因为您使用的是私有上下文,请确保调用performBlock
NSManagedObjectContext* moc = [self getManagedObjectContext];
[moc performBlock:^{
NSString *entityName = @"myEntity";
NSFetchRequest *fRequest = [[NSFetchRequest alloc]initWithEntityName:entityName];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELECT * FROM myEntity"];
[fRequest setPredicate:predicate];
NSError *error = nil;
NSArray *results = [moc executeFetchRequest:fRequest error:&error];
}];
您不能在小部件视图中使用
FetchRequest
。他们什么都不观察。您需要将数据作为条目传递给视图。以下是一些可能的例子:或者这是否回答了你的问题?