iOS:如何创建我的核心数据库的备份副本?以及如何导出/导入该副本? [英] iOS: How can I create a backup copy of my core data base? And how to export/import that copy?

查看:311
本文介绍了iOS:如何创建我的核心数据库的备份副本?以及如何导出/导入该副本?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想向我的应用程序的用户提供创建核心数据数据库备份的可能性,特别是在他切换到新设备等时。

I want to offer the users of my app the possibility to create a backup of the core data database, especially in case he switches to a new device etc.

我该怎么做?特别是如何重新导入该文件?我的意思是说,他做一个数据库的备份副本,然后改变一吨东西,并想要重置为以前保存的备份副本。我将如何做?

How would I do that? Especially how can I reimport that file? I mean let's say he makes a backup copy of the database, then changes a ton of stuff and wants to reset to the previous saved backup copy. How would I do that?

Thx!

推荐答案

看看这个示例应用程序,它包括用于进行备份,从iCloud复制备份,通过电子邮件发送备份和从电子邮件导入备份的功能。
http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/

Take a look at this sample app, it includes functions for making backups, copying backups to and from iCloud, emailing 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/

使用migratePersistentStore API来制作/导入备份,如果你这样做和来自ICloud更安全。另请注意,示例应用程序假定您没有使用WAL模式,这是iOS 7的默认模式.WAL模式使用多个文件,所有这些文件都需要备份或复制。

BTW it's much safer to use migratePersistentStore API to make/import backups if your are doing so to and from ICloud. Also be aware that the sample app assumes you are not using WAL mode which is the default mode for iOS 7. WAL mode uses multiple files which all need to be backed up or copied.

这是指向视频的链接,演示了示例应用备份和恢复功能。

Here is a link to a video demonstrating the sample Apps 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-explanation / backup-files /

用于创建备份副本。请注意,可以使用多个persistentStoreCoordinators打开存储,因此无需在进行备份时将其关闭。恢复它显然需要先删除现有存储。注意,下面两种方法之间没有什么区别,除了源存储在使用或不使用iCloud选项时打开。

Here are the methods used to create copies for backup. Note that it is possible to open the store with multiple persistentStoreCoordinators so no need to close it down while you make a backup. Restoring it does obviously require the existing store to be removed first. Note that there is little difference between the two methods below except that the source store is opened 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;
}

这篇关于iOS:如何创建我的核心数据库的备份副本?以及如何导出/导入该副本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆