web-dev-qa-db-ja.com

コアデータをローカルにバックアップし、バックアップから復元します-Swift

コアデータのバックアップの作成に関する情報を見つけるのに苦労しています。私の最終的な目標は、ユーザーが複数のバックアップを作成し、選択したバックアップから復元できるようにすることです。

ローカルまたはObjective-CのiCloud経由でバックアップ/復元できるサンプルプロジェクトを見つけましたが、Swiftには何もありません。

誰か助けてもらえますか?または私を正しい方向に向けてください。これからどこから始めればいいのかわからない。

11
LateNate

私はこれをする必要はありませんでしたが、私がこれをした場合、私がすることです。

バックアップを作成するには

いつでも、次の手順を使用してください。

  1. 新しい2番目のCoreDataスタックを作成します。 NSPersistentContainerを作成するには、NSPersistentStoreCoordinatorまたは古い(ただしまだサポートされている)方法を使用します。
  2. NSPersistentStoreCoordinatorの関数migratePersistentStore(_:to:options:withType:)を使用してバックアップを作成します。 UUIDまたはタイムスタンプを使用して、宛先URLに一意のものを含めるようにします。バックアップをドキュメントフォルダに置きます。
  3. 日付ごとのバックアップのリストを保持します。これをUserDefaultsに入れるか、新しいプロパティリストファイルを作成してバックアップ情報を保存することができます。

手順2では、元のストアがCore Dataスタックから削除されます。そのため、手順1で2番目のスタックを作成します。このようにして、アプリが使用しているスタックに影響を与えることなく、2番目のスタックを使用してバックアップを作成できます。

NSPersistentContainerを使用している場合は、そのpersistentStoreCoordinatorプロパティを使用して手順2を実行します。

バックアップから復元するには

アプリが永続ストアを使用している可能性があるため、これは少し注意が必要ですが、今度はそれを古いバージョンに置き換えます。 バックアップから復元する前に、永続ストアの管理対象オブジェクトを現在使用していないことを確認してください。NSPersistentContainerの割り当てを解除します。管理対象オブジェクトを利用するUIをアンロードします。アプリをバックアップから復元するか、現在のデータの使用に戻るだけで、バックアップリスト以外のデータが表示されない状態にします。

あなたがそれをしたので、

  1. バックアップリストを表示し、ユーザーに選択させます。
  2. データモデルを使用してNSPersistentStoreCoordinatorを作成します。
  3. replacePersistentStore(at:destinationOptions:withPersistentStoreFrom:sourceOptions:ofType:)メソッドを使用して、バックアップデータを通常のアプリの場所にコピーします。開始場所はバックアップ場所であり、宛先はアプリが通常データを保存する場所です。
  4. (オプション)NSPersistentStoreCoordinatorの関数destroyPersistentStore(at:ofType:options:)を使用してバックアップを削除します。
  5. 通常どおりNSPersistentContainerをロードし、通常のアプリUIをリロードします。

これには、FileManagerのような直接ファイル関連のAPIを使用しないでください。 Core Dataメソッドは、Core Data関連のすべてのファイルをカバーし、データの破損を回避したり、ファイルロックを尊重したりするなど、その他の優れた機能を実行します。

15
Tom Harrington

より価値のある考えのためにちょうど2セント:問題に取り組むために、私はCloudKitを使用してさまざまな顧客ゾーンを作成し、コアデータからiCloudのアプリユーザーのプライベートデータベースにさまざまなバックアップを保存しようとしました。

0
Ron Liu

私はトムの答えとAppleサンプル コード の助けを借りて次のメソッドを作成しました。これはコアデータファイルのバックアップを取り、それをあなたのパスに配置します欲しいです。

スウィフト5

    /// Backing up store type to a new and unique location
    /// The method is illustrated in the following code fragment, which shows how you can use migratePersistentStore to take a back up of a store and save it from one location to another.
    /// If the old store type is XML, the example also converts the store to SQLite.
    /// - Parameters:
    ///   - path: Where you want the backup to be done, please create a new unique directory with timestamp or the guid
    ///   - completion: Passes error in case of error or pass nil in case of success
     class func backUpCoreDataFiles(path : URL, completion : @escaping (_ error : String?) -> ())
        {

            // Every time new container is a must as migratePersistentStore method will loose the reference to the container on migration
            let container = NSPersistentContainer(name : "<YourDataModelName>")
            container.loadPersistentStores
                { (storeDescription, error) in
                    if let error = error
                    {
                        fatalError("Failed to load store: \(error)")
                    }
            }
            let coordinator = container.persistentStoreCoordinator
            let store = coordinator.persistentStores[0]
            do
            {
                try coordinator.migratePersistentStore(store, to : path, options : nil, withType : NSSQLiteStoreType)
                completion(nil)
            }
            catch
            {
                completion("\(Errors.coredataBackupError)\(error.localizedDescription)")
            }
        }
0
Rein rPavi