我有一个带有核心数据和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];
据我了解文档,没有太多事要做(?)。 但我想我错过了什么,有没有人知道要检查什么,改变,尝试? 谁有同样的问题?任何想法都表示赞赏!
答案 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,你永远不会知道 - 幕后有太多的魔力。