无法从 CoreData 加载 5 个随机数据以用于 Widget,有啥想法可以支持吗?

Posted

技术标签:

【中文标题】无法从 CoreData 加载 5 个随机数据以用于 Widget,有啥想法可以支持吗?【英文标题】:Unable to load 5 random data from CoreData to use into Widget, any thoughts to support?无法从 CoreData 加载 5 个随机数据以用于 Widget,有什么想法可以支持吗? 【发布时间】:2020-12-27 05:19:01 【问题描述】:

在小部件时间线和错误的代码下方。获取请求 返回总是空的,导致超出范围进入随机索引。 数据和获取请求可以在所有其他应用视图中正常工作,包括使用不同的谓词。


    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) 
        
        var entries: [WidgetContent] = []
        
        let managedObjectContext = persistenceController.container.viewContext
        
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Task");
        
        let currentDate = Date()
        
        for hourOffset in 0 ..< 5 
            let entryDate = Calendar.current.date(byAdding: .minute, value: hourOffset, to: currentDate)!
            
            var entry = snapshotEntry
            
            var results = [Task]()
            
            do  results = try managedObjectContext.fetch(request) as! [Task] 
            catch let error as NSError  print("Could not fetch \(error), \(error.userInfo)") 
            
            let randomIndex = Int(arc4random_uniform(UInt32(results.count)))
            
            let displayComplete = results[randomIndex].isComplete
            let displayAdded = results[randomIndex].dateAdded
            let displayName = results[randomIndex].name
            let displayCategory = results[randomIndex].secondaryCategory
                
            entry = WidgetContent(date: entryDate, isComplete: displayComplete, dateAdded: displayAdded!, name: displayName!, secondaryCategory: displayCategory!)
            
            entries.append(entry)
        
        
        let timeline = Timeline(entries: entries, policy: .atEnd)
        completion(timeline)
    

【问题讨论】:

您设置了 AppGroup 吗? ***.com/questions/63922032/… 并确保您将核心数据保存到其中?另外你不应该使用 arc4random 你应该使用 Swift 的内置随机数生成 ***.com/a/24007169/5508175 是的,为应用程序和小部件创建和验证的 appgroup 还检查了权利。是的,正如我提到的应用程序工作正常,按预期将数据保存和加载到许多视图中,也使用不同的谓词。我只是在实现小部件。关于 random 和 arc4random,谢谢!对于反馈,我会看看它。 【参考方案1】:

终于找到了解决办法。

添加的数据库位置:

    let container: NSPersistentCloudKitContainer
    
init(inMemory: Bool = false) 
    let storeURL = AppGroup.tasks.containerURL.appendingPathComponent("Yours.sqlite")
    let description = NSPersistentStoreDescription(url: storeURL)

    container = NSPersistentCloudKitContainer(name: "Yours")
    if inMemory 
        container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
    
    container.persistentStoreDescriptions = [description]
    container.loadPersistentStores(completionHandler:  (storeDescription, error) in
        if let error = error as NSError? 
            fatalError("Unresolved error \(error), \(error.userInfo)")
        
    )

还更新了时间表以反映这些变化:

...

let managedObjectContext = PersistenceController.shared.container.viewContext
    

...

do  results = try managedObjectContext.fetch(request) as! [Task] 

...

现在效果很好。感谢 cmets 帮了大忙。

【讨论】:

以上是关于无法从 CoreData 加载 5 个随机数据以用于 Widget,有啥想法可以支持吗?的主要内容,如果未能解决你的问题,请参考以下文章

用于 iOS 开发的存储

CoreData:警告:无法加载名为的类

UICollectionview 未从 CoreData 完全加载图像获取随机空白单元格图像

在 cellForRowAtIndexPath 从 CoreData 加载图像会减慢滚动速度

python 生成随机数据以输入CTM算法。以“python2.7 ctmdata.py”运行。

CoreData:注释:无法加载优化模型(React Native)