2

Core Data によって管理され、iPhone アプリで iCloud と同期されているデータベースを使用しようとしています。

WWDC 2012 のサンプル コードを使用したところ、ほぼ正常に動作しました。

また、私のデータベースは非常に単純です。オブジェクトは 1 種類しかなく、関係はありません。

2 つのデバイスは iCloud を介して通信できますが、この小さなシナリオは失敗します。

  • デバイス A にオブジェクトを作成する
  • オブジェクトがデバイス B に表示されるのを待ちます
  • デバイス A 上のオブジェクトを変更します
  • デバイス B のオブジェクトを変更します
  • デバイス B が更新を認識すると、変更をマージしようとし、アプリがクラッシュします。

はい、アプリがクラッシュします。私のデータベースには 1 つのオブジェクトしかなく、Core Data は小さな衝突を解決できないようです。

永続ストアを作成する方法とオプションは次のとおりです。

NSDictionary *options = @{NSPersistentStoreUbiquitousContentNameKey : contentName,
NSPersistentStoreUbiquitousContentURLKey : iCloudLogsPath};
self.iCloudStore = [self.persistentStoreCoordinator  
    addPersistentStoreWithType:NSSQLiteStoreType
    configuration:nil
    URL:iCloudData
    options:options
    error:&error];

バックグラウンドで NSManagedObjectContext を作成するために使用するコードは次のとおりです。

- (NSManagedObjectContext*) currentThreadContext {

    NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [moc setPersistentStoreCoordinator:self.persistentStoreCoordinator];
    [moc setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];
    return moc;
}

例外をキャッチするためにブレークポイントを追加しました。これが得られるものです。

objc_exception_throw:
[NSPersistentStoreCoordinator executeRequest:withContext:error:]:
[NSManagedObjectContext save:]:
[_PFUbiquityRecordImportOperation main]:
[__NSOperationInternal start]:
[_PFUbiquityRecordsImporter scheduleTransactionLogOperations:synchronous:error:]:
[_PFUbiquityRecordsImporter scanOperationFinished:withDiscoveredLogLocation:error:]:
[PFUbiquityImportScanOperation main]:
[__NSOperationInternal start]:
[_PFUbiquityRecordsImporter scheduleUbiquityRootScan:withLocalPeerLogs:error:]:
[_PFUbiquityRecordsImporter rollResponseOperation:successfullyAdoptedBaseline:]:
[PFUbiquityBaselineRollResponseOperation main]:
[__NSOperationInternal start]:

どんな助けでも大歓迎です!

4

0 に答える 0