Take a look at this sample application, it includes functions for creating backups, copying backups to and from iCloud, sending email backups, and importing backups from email. http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/
BTW is much safer to use the migratePersistentStore API to create / import backups if you do this in and out of iCloud. Also keep in mind that the sample application assumes that you are not using WAL mode, which is the default mode for iOS 7. WAL mode uses several files, all of which must be copied or copied.
Here is a link to a video demonstrating examples of application backup and restore capabilities.
http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/sample-apps-explanations/backup-files/
Here are the methods used to create backup copies. Please note that you can open a repository with several persistentStoreCoordinators, so you do not need to close it when creating a backup. Its restoration requires, first of all, the removal of the existing storage. Please note that there is a slight difference between the two methods, except that the source repository opens with or without iCloud options.
/*! Creates a backup of the ICloud store @return Returns YES of file was migrated or NO if not. */ - (bool)backupICloudStore { FLOG(@"backupICloudStore called"); // Lets use the existing PSC NSPersistentStoreCoordinator *migrationPSC = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; // Open the store id sourceStore = [migrationPSC addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self icloudStoreURL] options:[self icloudStoreOptions] error:nil]; if (!sourceStore) { FLOG(@" failed to add old store"); migrationPSC = nil; return FALSE; } else { FLOG(@" Successfully added store to migrate"); NSError *error; FLOG(@" About to migrate the store..."); id migrationSuccess = [migrationPSC migratePersistentStore:sourceStore toURL:[self backupStoreURL] options:[self localStoreOptions] withType:NSSQLiteStoreType error:&error]; if (migrationSuccess) { FLOG(@"store successfully backed up"); migrationPSC = nil; // Now reset the backup preference [[NSUserDefaults standardUserDefaults] setBool:NO forKey:_makeBackupPreferenceKey]; [[NSUserDefaults standardUserDefaults] synchronize]; return TRUE; } else { FLOG(@"Failed to backup store: %@, %@", error, error.userInfo); migrationPSC = nil; return FALSE; } } migrationPSC = nil; return FALSE; } /*! Creates a backup of the Local store @return Returns YES of file was migrated or NO if not. */ - (bool)backupLocalStore { FLOG(@"backupLocalStore called"); // Lets use the existing PSC NSPersistentStoreCoordinator *migrationPSC = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; // Open the store id sourceStore = [migrationPSC addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self localStoreURL] options:[self localStoreOptions] error:nil]; if (!sourceStore) { FLOG(@" failed to add old store"); migrationPSC = nil; return FALSE; } else { FLOG(@" Successfully added store to migrate"); NSError *error; FLOG(@" About to migrate the store..."); id migrationSuccess = [migrationPSC migratePersistentStore:sourceStore toURL:[self backupStoreURL] options:[self localStoreOptions] withType:NSSQLiteStoreType error:&error]; if (migrationSuccess) { FLOG(@"store successfully backed up"); migrationPSC = nil; // Now reset the backup preference [[NSUserDefaults standardUserDefaults] setBool:NO forKey:_makeBackupPreferenceKey]; [[NSUserDefaults standardUserDefaults] synchronize]; return TRUE; } else { FLOG(@"Failed to backup store: %@, %@", error, error.userInfo); migrationPSC = nil; return FALSE; } } migrationPSC = nil; return FALSE; } /** Sets the selected file as the current store. Creates a backup of the current store first. @param fileURL The URL for the file to use. */ - (BOOL)restoreFile:(NSURL *)fileURL { FLOG(@" called"); // Check if we are using iCloud if (_isCloudEnabled) { FLOG(@" using iCloud store so OK to restore"); NSURL *currentURL = [self storeURL]; FLOG(@" currentURL is %@", currentURL); FLOG(@" URL to use is %@", fileURL); [self saveContext]; [self backupCurrentStoreWithNoCheck]; // Close the current store and delete it _persistentStoreCoordinator = nil; _managedObjectContext = nil; [self removeICloudStore]; [self moveStoreFileToICloud:fileURL delete:NO backup:NO]; } else { FLOG(@" using local store so OK to restore"); NSURL *currentURL = [self storeURL]; FLOG(@" currentURL is %@", currentURL); FLOG(@" URL to use is %@", fileURL); [self saveContext]; [self backupCurrentStoreWithNoCheck]; // Close the current store and delete it _persistentStoreCoordinator = nil; _managedObjectContext = nil; NSError *error = nil; NSFileManager *fm = [[NSFileManager alloc] init]; // Delete the current store file if ([fm fileExistsAtPath:[currentURL path]]) { FLOG(@" target file exists"); if (![fm removeItemAtURL:currentURL error:&error]) { FLOG(@" error unable to remove current store file"); NSLog(@"Error removing item Error: %@, %@", error, error.userInfo); return FALSE; } else { FLOG(@" current store file removed"); } } // //simply copy the file over BOOL copySuccess = [fm copyItemAtPath:[fileURL path] toPath:[currentURL path] error:&error]; if (copySuccess) { FLOG(@" replaced current store file successfully"); //[self postFileUpdateNotification]; } else { FLOG(@"Error copying items Error: %@, %@", error, error.userInfo); return FALSE; } } // Now open the store again [self openPersistentStore]; return TRUE; }
Duncan groenewald
source share