【问题标题】:iCloud Core Data "no document at URL"iCloud 核心数据“URL 处没有文档”
【发布时间】:2023-03-08 16:15:01
【问题描述】:

我有一个包含核心数据和 icloud 的应用程序,允许用户在多个设备上使用相同的数据库。同步在大多数情况下都能完美运行,但有时不会,即只是跳过了一些事务。

当我检查控制台时,我收到错误消息:

__45-[PFUbiquityFilePresenter processPendingURLs]_block_invoke(439): CoreData: Ubiquity: Librarian 在开始下载时返回了一个严重错误 Error Domain=BRCloudDocsErrorDomain Code=5 “操作无法完成。(BRCloudDocsErrorDomain 错误 5 - URL 处没有文档)”

有趣的是,即使在同步工作时也会出现此消息。

代码符合 Apple 最新版本的“iCloud 核心数据编程指南”。 storeURL 编码如下:

 NSURL *documentsDirectory = [[[NSFileManager defaultManager]  URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
 NSURL *storeURL = [documentsDirectory  URLByAppendingPathComponent:@"iCloudSample.sqlite"];

选项代码:

  storeOptions =          @{NSPersistentStoreUbiquitousContentNameKey: @"iCloudSampleStore" ,
                            NSPersistentStoreUbiquitousContentURLKey: @"iCloudSampleURL"};

商店代码:

NSPersistentStore *store = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                     configuration:nil
                                                               URL:storeURL
                                                           options:storeOptions
                                                             error:&error];

合并策略(MOC 在主队列上)

  _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];

_managedObjectContext.mergePolicy = [[NSMergePolicy alloc]
                                    initWithMergeType:NSMergeByPropertyObjectTrumpMergePolicyType];

据我了解文档,实际上没有更多工作要做(?)。 但我想我错过了一些东西,有没有人知道要检查、改变、尝试什么? 有同样问题的人吗?任何想法表示赞赏!

【问题讨论】:

  • 我也有同样的问题,不知道是什么问题:S
  • 我刚收到 Apple 的反馈,我应该提交一份错误报告 - 让我们看看它是如何运作的,会及时通知您
  • 我也有类似的问题。
  • 看到同样的事情。在 Apple 修复此问题之前,我添加了一个“从云端重新加载”按钮。如果用户注意到他在一台设备上输入的内容在另一台设备上丢失,他可以简单地从 iCloud 重新加载所有内容。当然不是最优的,尤其是随着数据库的增长,但总比没有办法强制同步而只是丢失数据要好。

标签: ios core-data icloud


【解决方案1】:

我发现当我的商店网址在路径中有.s 时

(例如---/com.companyName.project/---

let applicationSupportDirectory = applicationSupportDirectoryURL.URLByAppendingPathComponent("com.companyName.project")
let iCloudStoreFileName = "iCloud.sqlite"
lazy var iCloudStoreURL: NSURL = {
    return self.applicationSupportDirectory.URLByAppendingPathComponent(self.iCloudStoreFileName)
}()

当我启用日志记录时,在 Xcode 中为我的项目转到 Edit Scheme... 并添加:

-com.apple.CoreData.SyntaxColoredLogging 1

调试窗口中的日志文件显示它正在搜索的路径是

---/com~companyName~project/---

核心数据已将.s 更改为~s。我从 URL 中删除了整个 com.companyName.project,并且同步似乎效果更好。但有了核心数据和 iCloud,你永远不知道——幕后有太多的魔力。

【讨论】:

    【解决方案2】:

    我有同样的问题,并通过删除persistentStore 并在应用程序运行时再次添加它来解决它。在第一个设备中进行多次更改时总是同样的问题,第二个设备没有得到所有的更改。我在applicationDidBecomeActive时使用下面的代码先删除持久化存储:

    var storeCoordinator:NSPersistentStoreCoordinator = persistentStoreCoordinator!
            var store:NSPersistentStore = storeCoordinator.persistentStores[0] as! NSPersistentStore
            var storeURL:NSURL = store.URL!
            storeCoordinator.removePersistentStore(store, error: nil)
            NSFileManager.defaultManager().removeItemAtPath(storeURL.path!, error: nil)
    

    接下来我继续添加persistentStore。然后我收到了所有通知,因为这是安装后的第一次运行,但同步了完整的数据。它总是有效,但我不知道这是否是处理问题的正确方法。

    我相信在第一个设备中所做的所有更改总是会到达第二个设备,但由于某些奇怪的原因,它们并没有完全与本地核心数据合并。我对 iCloud-CoreData 问题做了一些奇怪的观察:

    https://stackoverflow.com/questions/32084952/core-data-to-icloud-doesnt-sync-all-changes

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答,我想这根本不可靠。错误报告仍然没有回答,也没有排名。
    猜你喜欢
    • 2018-01-08
    • 2021-12-08
    • 2016-01-07
    • 2013-06-03
    • 1970-01-01
    • 2015-04-09
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多