-2

Core Data ストアのバックアップ/復元を試みています。私のアプリでは、ファイルを作成し、fileExistsAtPathを実行すると、ファイルがそこにあります。Finder を使用すると、そこにはありません。これは、バックアップを作成するためのコードです (コピーして変更したため、スタイルと重複した名前は私のものではありません。おそらく最初からやり直す必要があります)。

更新コードはここにあります...

これはコンソール出力です:

現在の URL は file:///Users/spokanedude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/41B5E165-C3E2-4D8A-81EB-98ADB20B8B0D/Documents/saori です。 .sqlite 2015-01-20 10:41:36.042 サロンブック[84743:2055509]

使用するバックアップ ファイルの URL は、file:///Users/spokanedude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/41B5E165-C3E2-4D8A-81EB-98ADB20B8B0D です。 /Documents/saori.backup-20153920103944

2015-01-20 10:41:36.042 サロンブック[84743:2055509]

currentCoreData が存在します 2015-01-20 10:41:36.042 SalonBook[84743:2055509]

backupFile が存在します 2015-01-20 10:41:36.042 SalonBook[84743:2055509]

対象ファイルあり 2015-01-20 10:41:36.092 SalonBook[84743:2055509] 現在のストアファイルを削除

2015-01-20 10:41:36.125 SalonBook[84743:2055509] は現在のストア ファイルを正常に置き換えました

2015-01-20 10:41:36.126 SalonBook[84743:2055509] store オプションは { NSSQLitePragmasOption = { "journal_mode" = WAL; }; } 2015-01-20 10:41:36.127 SalonBook[84743:2055509] addPersistentStoreWithType が正常に完了しました...

2015-01-20 10:41:36.127 SalonBook[84743:2055509] STORE FILE は /Users/spokanedude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/ 41B5E165-C3E2-4D8A-81EB-98ADB20B8B0D/ドキュメント/saori.sqlite

バックアップを実行すると、ファイルがそこにあると表示されます。ForkLift (Finder の代替品) を使用すると、(時々) 表示されます。復元を実行すると、ファイルが見つかり、復元が成功したと表示されますが、代わりに、ファイルの内容が欠落しているように、既存のデータが消去されます。私の人生でこれを理解することはできません...助けていただければ幸いです。

4

1 に答える 1

1

まず、 のドキュメントを確認しますfileExistsAtPath:。次の警告が表示されます。

ファイル システムまたはファイル システム上の特定のファイルの現在の状態に基づいて動作を推測しようとすることはお勧めできません。これを行うと、奇妙な動作や競合状態が発生する可能性があります。操作 (ファイルの読み込みやディレクトリの作成など) を試み、エラーをチェックし、それらのエラーを適切に処理する方が、操作が成功するかどうかを事前に判断しようとするよりもはるかに優れています。

それはまさにあなたがしていることであり、予期しない動作が見られます。

WALモードを使用する場合、必要なデータのほとんどは「saori.sqlite」ファイルではなく、SQLiteが同じディレクトリに配置する他のファイルにあります。「saori.sqlite」ファイルは、WAL モードを使用している場合、実際には書き込まれない場合があります。Apple Technical QA 1809でこれが文書化されています。詳細については、SQLite のドキュメントを参照してください。

このような理由から、各 Core Data SQLite ストアに独自のディレクトリを指定することをお勧めします。

「saori.sqlite」ファイルを新しい場所にコピーして Core Data使用して開こうとすると、格納されている他のファイルは事実上空になります。そして、あなたは行き​​ます:(

残念ながら、これは復元の実装が行うことです。バックアップ「saori.sqlite」ファイルを取得し、WAL モードで使用される他のファイルなしで新しい場所にコピーします。次に、その場所を使用して新しいストアを追加しますが、WAL ファイルが見つからないため、Core Data が新しいファイルを作成します。これにより、データが失われます。データは移動されず、Core Data によって新しいファイルが作成されました。

復元を実行するための推奨される方法は、バックアップの逆で、移行を使用することです。

于 2015-01-20T19:18:47.733 に答える