In my application, which is available on the Mac Appstore, I have iCloud + Core Data integrated for Mavericks users. Therefore, I use the latest iCloud implementation, which was not as buggy as the old ... I thought.
So far, everything was in order, with the last update of the application I made small changes to the database, just adding a few new properties for the object and, of course, created a new version of the model for it.
If you run the updated version, all the data is there, and everything is in order. All entities still exist. This is the console output:
storesDidChange: {
added = (
"<NSSQLCore: 0x100410d10> (URL: file:///Users/lars/Library/Containers/de.nulldesign.tyme.osx/Data/Library/Application%20Support/de.nulldesign.tyme/CoreDataUbiquitySupport/lars~053CB071-18DD-5ED8-B2F0-DD0341B523C7/iCloudStore/2B3578B9-3A28-492B-8C62-BFF7FE7076F3/store/TymeCloud.storedata)"
);
}
-[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](760): CoreData: Ubiquity: lars~053CB071-18DD-5ED8-B2F0-DD0341B523C7:iCloudStore
Using local storage: 1
After some time, an importer error occurs:
__76-[_PFUbiquityRecordsImporter batchDownloadTransactionLogsAtLocations:error:]_block_invoke(763): CoreData: Ubiquity: Librian returned a serious error for starting downloads Error Domain=LibrarianErrorDomain Code=1 "Der Vorgang konnte nicht abgeschlossen werden. (LibrarianErrorDomain-Fehler 1 - Unable to initiate download.)" UserInfo=0x600000271440 {NSDescription=Unable to initiate download., Item Errors={
"file:///Users/lars/Library/Mobile%20Documents/HR22V4547K~de~nulldesign~tyme/CoreData/iCloudStore/lars~053CB071-18DD-5ED8-B2F0-DD0341B523C7/iCloudStore/16Dv7DuLeM4RoFUBtAVIQokfWJRwGABtWC81frFMCp0=/7B142E0C-3C97-4344-B647-28330E5D7FE3.1.cdt" = "Error Domain=UBErrorDomain Code=0 \"Der Vorgang konnte nicht abgeschlossen werden. (UBErrorDomain-Fehler 0 - Error Domain=UBErrorDomain Code=0 \"The operation couldn\U2019t be completed. (UBErrorDomain error 0.)\")\"
…
UserInfo=0x600000271600 {NSDescription=Error Domain=UBErrorDomain Code=0 \"The operation couldn\U2019t be completed. (UBErrorDomain error 0.)\"}";
};
NSDescription = "Unable to initiate download.";
NSUnderlyingError = "Error Domain=UBErrorDomain Code=0 \"Der Vorgang konnte nicht abgeschlossen werden. (UBErrorDomain-Fehler 0.)\"";
}
Then the stores change events:
storesWillChange: {
NSPersistentStoreUbiquitousTransitionTypeKey = 4;
added = (
"<NSSQLCore: 0x100211490> (URL: file:///Users/lars/Library/Containers/de.nulldesign.tyme.osx/Data/Library/Application%20Support/de.nulldesign.tyme/CoreDataUbiquitySupport/lars~053CB071-18DD-5ED8-B2F0-DD0341B523C7/iCloudStore/2B3578B9-3A28-492B-8C62-BFF7FE7076F3/store/TymeCloud.storedata)"
);
removed = (
"<NSSQLCore: 0x100211490> (URL: file:///Users/lars/Library/Containers/de.nulldesign.tyme.osx/Data/Library/Application%20Support/de.nulldesign.tyme/CoreDataUbiquitySupport/lars~053CB071-18DD-5ED8-B2F0-DD0341B523C7/iCloudStore/2B3578B9-3A28-492B-8C62-BFF7FE7076F3/store/TymeCloud.storedata)"
);
}
And quite a few stores WillChange and storeDidChange shorty after:
storesDidChange: {
removed = (
"<NSSQLCore: 0x100410d10> (URL: file:///Users/lars/Library/Containers/de.nulldesign.tyme.osx/Data/Library/Application%20Support/de.nulldesign.tyme/CoreDataUbiquitySupport/lars~053CB071-18DD-5ED8-B2F0-DD0341B523C7/iCloudStore/2B3578B9-3A28-492B-8C62-BFF7FE7076F3/store/TymeCloud.storedata)"
);
}
-[PFUbiquitySetupAssistant tryToReplaceLocalStore:withStoreSideLoadedByImporter:](3250): CoreData: Ubiquity: <PFUbiquitySetupAssistant: 0x100411670>
Error refreshing peer range cache: (null)
storesDidChange: {
NSPersistentStoreUbiquitousTransitionTypeKey = 4;
added = (
"<NSSQLCore: 0x100410d10> (URL: file:///Users/lars/Library/Containers/de.nulldesign.tyme.osx/Data/Library/Application%20Support/de.nulldesign.tyme/CoreDataUbiquitySupport/lars~053CB071-18DD-5ED8-B2F0-DD0341B523C7/iCloudStore/2B3578B9-3A28-492B-8C62-BFF7FE7076F3/store/TymeCloud.storedata)"
);
removed = (
"<NSSQLCore: 0x100410d10> (URL: file:///Users/lars/Library/Containers/de.nulldesign.tyme.osx/Data/Library/Application%20Support/de.nulldesign.tyme/CoreDataUbiquitySupport/lars~053CB071-18DD-5ED8-B2F0-DD0341B523C7/iCloudStore/2B3578B9-3A28-492B-8C62-BFF7FE7076F3/store/TymeCloud.storedata)"
);
}
storesDidChange: {
added = (
"<NSSQLCore: 0x10020cdb0> (URL: file:///Users/lars/Library/Containers/de.nulldesign.tyme.osx/Data/Library/Application%20Support/de.nulldesign.tyme/CoreDataUbiquitySupport/lars~053CB071-18DD-5ED8-B2F0-DD0341B523C7/iCloudStore/2B3578B9-3A28-492B-8C62-BFF7FE7076F3/store/TymeCloud.storedata)"
);
}
-[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](760): CoreData: Ubiquity: lars~053CB071-18DD-5ED8-B2F0-DD0341B523C7:iCloudStore
Using local storage: 1
, , , Mac. . , :
PFUbiquitySwitchboardEntryMetadata setUseLocalStorage: : 0
Mac .
: , NSPersistentStoreUbiquitousContentNameKey. , NSPersistentStoreUbiquitousContentNameKey, , .
, NSPersistentStoreUbiquitousContentNameKey, , , , ,
, , iCloud. , , .
:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if(_persistentStoreCoordinator)
{
return _persistentStoreCoordinator;
}
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if(_iCloudConnectionPossible)
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(storesWillChange:)
name:NSPersistentStoreCoordinatorStoresWillChangeNotification
object:_persistentStoreCoordinator];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(persistentStoreDidImportUbiquitousContentChanges:)
name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
object:_persistentStoreCoordinator];
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(storesDidChange:)
name:NSPersistentStoreCoordinatorStoresDidChangeNotification
object:_persistentStoreCoordinator];
NSURL *localStoragePath = [self dataStorePathUseiCloud:_useCloudStorage];
NSError *error = nil;
[_persistentStoreCoordinator lock];
NSPersistentStore *persistentStore = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storagePath
options:[self storeOptionsUseiCloud:_useCloudStorage]
error:&error];
[_persistentStoreCoordinator unlock];
return _persistentStoreCoordinator;
}
- (NSDictionary *)storeOptionsUseiCloud:(BOOL)useiCloud
{
NSMutableDictionary *options = [NSMutableDictionary dictionary];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
if(useiCloud)
{
[options setObject:@"iCloudStore" forKey:NSPersistentStoreUbiquitousContentNameKey];
}
return options;
}
- (NSManagedObjectContext *)managedObjectContext
{
if(_managedObjectContext)
{
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if(coordinator != nil)
{
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
moc.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
[moc performBlockAndWait:^
{
[moc setPersistentStoreCoordinator:coordinator];
}];
_managedObjectContext = moc;
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contextWillSaveNotification:)
name:NSManagedObjectContextWillSaveNotification
object:_managedObjectContext];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeChangesAfterDidSaveNotification:)
name:NSManagedObjectContextDidSaveNotification
object:_managedObjectContext];
return _managedObjectContext;
}
Will/DidChange :
- (void)storesWillChange:(NSNotification *)note
{
NSManagedObjectContext *moc = self.managedObjectContext;
[moc performBlockAndWait:^
{
NSError *error = nil;
if([moc hasChanges])
{
[moc save:&error];
}
[moc reset];
}];
}
- (void)storesDidChange:(NSNotification *)note
{
}
? ?