1

多くの画像(数十)を利用するAndroidアプリを書いています。これらの画像は、アプリ内の他のほとんどのデータと同様に、リモート データベースから更新されます。データについては、ローカル データベースを作成し、リモート データベースが更新されるたびにリモート データベースと同期します。

リモート データベースは画像を URL として保存し、アプリはこれらの URL から画像をダウンロードしてアプリに表示します。したがって、ローカル データベースをリモート データベースと同期させるだけで、使用しているすべての画像ファイルの URL を取得し、アプリを実行するたびにリモート サーバーからそれらを再ダウンロードできますが、これは明らかに遅く、多くのデータを無駄にします。

私がやりたいことは、データベースが更新されて同期が必要になるたびに、アプリはローカル データベースを同期し、通常どおり URL から新しい画像をダウンロードしますが、デバイスのどこかに画像ファイルを保存するので、次にアプリを実行すると、デバイスから画像を取得できます。

これを行う効果的な方法を見つけることができないようです。おそらく、そもそもこの方法で行うのは悪い考えだからですか? Sharepreferences にはおそらく十分なスペースがなく、外部ストレージは常に利用できるわけではありません。ローカル データベースに大量のバイナリ データ (画像など) を保存するのは悪い考えだと聞いています。

ここでのオプションは何ですか?

4

1 に答える 1

2

Androidストレージ オプションから始めます。

さらに遠く:

外部ストレージは常に利用できるわけではありません

これは理論的には正しいですが、実際には、特に新しいデバイス向けに開発している場合は、99% の確率で外部ストレージを使用することになります。「外部ストレージ」と SD カードは同じものではないことに注意してください。ここでの用語は混乱を招きます。これには、 を使用しますgetExternalFilesDir()

とにかく、画像ストレージが妥当な量である場合 (<100MB は妥当な IMHO)、内部ストレージを使用することができます。Android 3.x の時点では、初期のデバイスのようにデバイスのスペースが不足することはありません。実際には、99% の確率で問題ありません。ここで、 によって返されるキャッシュ ディレクトリを使用することができますgetCacheDir()

私のアプリの 1 つに、CDN と同期されている多数のファイルがあります。同期プロセスとデータベースを使用して、ダウンロード URL とファイルの MD5 ハッシュを取得します。MD5 ハッシュが変更された場合は、バックグラウンドでファイルを再度ダウンロードします。ハッシュをファイル名として使用してファイルを保存するだけなので、重複ファイルを簡単に解決できます。また、定期的に cacheDir を調べて、データベースで参照されなくなったファイルがあるかどうかを確認します。

于 2014-05-09T18:24:19.243 に答える