iCloud核心数据“网址没有文档”

时间:2015-06-09 11:33:46

标签: ios core-data icloud

我有一个带有核心数据和icloud的应用程序,允许用户在多个设备上使用相同的数据库。同步在大部分时间都是完美的,但有时它不会,即一些交易被简单地跳过。

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

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

即使同步有效,也会显示此消息。

该代码适用于Apple最新版本的“iCloud Core Data for Core Data”。 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];

据我了解文档,没有太多事要做(?)。 但我想我错过了什么,有没有人知道要检查什么,改变,尝试? 谁有同样的问题?任何想法都表示赞赏!

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并通过删除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

我希望它有所帮助。

答案 1 :(得分:1)

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

(例如---/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。我从URL中删除了整个com.companyName.project,同步似乎更好。但是凭借核心数据和iCloud,你永远不会知道 - 幕后有太多的魔力。