コアデータのバックアップの作成に関する情報を見つけるのに苦労しています。私の最終的な目標は、ユーザーが複数のバックアップを作成し、選択したバックアップから復元できるようにすることです。
ローカルまたはObjective-CのiCloud経由でバックアップ/復元できるサンプルプロジェクトを見つけましたが、Swiftには何もありません。
誰か助けてもらえますか?または私を正しい方向に向けてください。これからどこから始めればいいのかわからない。
私はこれをする必要はありませんでしたが、私がこれをした場合、私がすることです。
いつでも、次の手順を使用してください。
NSPersistentContainer
を作成するには、NSPersistentStoreCoordinator
または古い(ただしまだサポートされている)方法を使用します。NSPersistentStoreCoordinator
の関数migratePersistentStore(_:to:options:withType:)
を使用してバックアップを作成します。 UUIDまたはタイムスタンプを使用して、宛先URLに一意のものを含めるようにします。バックアップをドキュメントフォルダに置きます。UserDefaults
に入れるか、新しいプロパティリストファイルを作成してバックアップ情報を保存することができます。手順2では、元のストアがCore Dataスタックから削除されます。そのため、手順1で2番目のスタックを作成します。このようにして、アプリが使用しているスタックに影響を与えることなく、2番目のスタックを使用してバックアップを作成できます。
NSPersistentContainer
を使用している場合は、そのpersistentStoreCoordinator
プロパティを使用して手順2を実行します。
アプリが永続ストアを使用している可能性があるため、これは少し注意が必要ですが、今度はそれを古いバージョンに置き換えます。 バックアップから復元する前に、永続ストアの管理対象オブジェクトを現在使用していないことを確認してください。NSPersistentContainer
の割り当てを解除します。管理対象オブジェクトを利用するUIをアンロードします。アプリをバックアップから復元するか、現在のデータの使用に戻るだけで、バックアップリスト以外のデータが表示されない状態にします。
あなたがそれをしたので、
NSPersistentStoreCoordinator
を作成します。replacePersistentStore(at:destinationOptions:withPersistentStoreFrom:sourceOptions:ofType:)
メソッドを使用して、バックアップデータを通常のアプリの場所にコピーします。開始場所はバックアップ場所であり、宛先はアプリが通常データを保存する場所です。NSPersistentStoreCoordinator
の関数destroyPersistentStore(at:ofType:options:)
を使用してバックアップを削除します。NSPersistentContainer
をロードし、通常のアプリUIをリロードします。これには、FileManager
のような直接ファイル関連のAPIを使用しないでください。 Core Dataメソッドは、Core Data関連のすべてのファイルをカバーし、データの破損を回避したり、ファイルロックを尊重したりするなど、その他の優れた機能を実行します。
より価値のある考えのためにちょうど2セント:問題に取り組むために、私はCloudKitを使用してさまざまな顧客ゾーンを作成し、コアデータからiCloudのアプリユーザーのプライベートデータベースにさまざまなバックアップを保存しようとしました。
私はトムの答えと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)")
}
}