0

オーディオを録音し、メタデータを含むテーブル ビューで表示する iOS アプリを開発しています。レコードを保存するために使用してYapDatabaseいます。wiki を読むことで、記録を保存し、ファイルと記録の間に境界を作成することができます。期待どおりに機能しています。たとえば、レコードを削除すると、YapDatabaseRelation拡張子によってレコードに関連付けられたファイルも削除されます。ファイルの名前を変更してそのfileURLプロパティを更新すると、更新する代わりにファイルを削除します。

現在、この問題に対処するために、ファイル マネージャーを使用してファイルの名前を手動で変更し、そのfileURLプロパティを更新しています。ここで何か不足していますか?

4

1 に答える 1

2

ファイルマネージャーを使用して手動でファイルの名前を変更し、その fileURL プロパティを更新します

これが正しい方法です。

YapDatabaseRelationship は、リンクされたファイルの削除以外のファイル操作をサポートしていません。その理由が気になる方は読み進めてください。

YapDatabaseRelationship エクステンションは以下を区別できません:

  • 「このファイルの名前を変更してください」
  • 「以前にリンクされたファイルを削除し、今すぐこの新しいパスにリンクしてください」

つまり、表示されるのは次のとおりです。

  • 以前に与えたエッジ (filePathA)
  • あなたが今与えたエッジ (filePathB)

fileURL が異なることを認識しているため、エッジが変更されています。したがって、その観点からは、以前のエッジは現在壊れているか削除されており、新しいエッジに置き換えられます。したがって、filePathA を削除する、壊れたエッジの削除ルールが実行されます。

filePathB が存在するかどうかに基づいて、拡張機能が自分の意図を判断できるはずだと主張する人もいるかもしれません。しかし、そうではありません。一部の開発者は、最初にデータベース エッジを作成し、その後でファイルを所定の位置に移動することを選択します。なぜ正確に?

ファイル システム (ディスク上のイメージなど) とデータベースの両方を操作する場合、基本的に 2 つの別個のアトミック システムがあります。たとえば、次の操作を考えてみましょう。

  1. ファイルシステムにイメージを書き込む
  2. データベースを更新して画像にリンクする

手順 1 の完了後、手順 2 の前にアプリがクラッシュする場合は、アプリのドキュメント フォルダー内のファイルが "リーク" している可能性があります。ただし、逆の手順 (ステップ 2、次にステップ 1) を実行した場合は、ファイルを「漏えい」しないという意味でより安全ですが、データベース項目がファイル URL ではないファイル URL を指している可能性があるという新しい問題があります。まだ有効です。これは問題になる場合とそうでない場合があります。一部の開発者は、データベースを使用してキャッシュ フォルダー内のアイテムを追跡しますが、キャッシュ フォルダーはいつでも消える可能性があることを知っています。

これで混乱が解消されることを願っています。

于 2016-01-26T18:00:13.090 に答える