4

Sqlite データベースで見つかった車のリストを閲覧できるアプリがあるとしましょう。リスト内の車をクリックすると、車の説明と車の写真が表示されたビューが開きます。

私の質問は、この特定の車の行のバイナリ データ列として写真をデータベースに保持する必要があるか、またはリソース ディレクトリのどこかに写真を保持する必要があるかということです。どちらにするのが良いですか?バイナリ データ列の大きさに関して Sqlite の制限はありますか?

データベースはほとんど読み取り専用で、アプリにバンドルされます (したがって、ユーザーは車とその写真を挿入しません)。

4

2 に答える 2

4

これは、かなり議論されている決定です。そして私の意見では、それは個人的な好みの問題です。vim/emacs、windows/linux のような議論によく似ています。それほど熱くはありませんが。

どちらの側にも長所と短所があります。それらをデータベースに保存する場合、ファイル名と場所についてあまり心配する必要はありません。管理も簡単です (BLOB を含む行を削除するだけです)。しかし、ファイルへのアクセスも難しくなり、何らかの方法でラッパー コードを記述する必要がある場合があります(「download.php」リンクの一部など)。

一方、バイナリ データを別のファイルとして格納すると、管理が複雑になります (最初にファイル名を作成して、ディスクから適切なファイルを開く必要があります)。大規模なデータ セットでは、1 つのディレクトリ内のファイル数が非常に大きくなると、ファイル システムのボトルネックに遭遇する可能性があります (ただし、これはサブディレクトリを作成することで簡単に防ぐことができます)。しかし、データがファイルとして保存されている場合は、それらの置き換えが非常に簡単になります。他の人も内部を知らなくてもアクセスできます (たとえば、UI のカスタマイズを楽しんでいるユーザーを想像してみてください)。

他にも指摘すべき点はあると思いますが、今はあまり書きたくありません...

私が言いたいのは、写真に対してどのような操作を行いたいか (および両方の保存方法の制限) を考え、そこから情報に基づいた決定を下すことです。うまくいかないことはあまりありません。

TX-ログと FS-ジャーナル

さらに調査したところ、さらに情報が見つかりました。

  • SQLite はトランザクション ログを使用します
  • Android は、システム マウント ポイントで YAFFS を使用し、SD カードで VFAT を使用します。両方とも (私の知る限りでは) ジャーナリングされていません。

SQLite の TX-Log の正確な実装はわかりませんが、各INSERT/UPDATE操作がディスク上で 2 つの書き込みを実行することが予想されます。私は間違っているかもしれません (トランザクションの実装に大きく依存します) が、率直に言って、SQLite のソース コードをざっと目を通すことはできませんでした。ここで髪を分割し始めたように感じます(時期尚早の最適化ですか?)...

両方のファイル システム (YAFFS と VFAT) はジャーナリングされていないため、追加の「隠し」書き込み操作はありません。

これらの 2 つの点は、ファイル システムを支持するものです。

この情報は、一粒の塩で受け取ることに注意してください。と の Google の結果をざっと見ただけYAFFS journalingですsqlite transaction log。私はいくつかの詳細を見逃しているかもしれません。

于 2010-06-07T15:33:57.260 に答える
0

BLOB または文字列のデフォルトの MAX SQLite サイズは 2 31 -1 バイトです。この値は、ROW に格納される最大バイト数にも適用されます。

どちらの方法が良いか、私にはわかりません。あなたのケースで私がすることは、両方の方法をテストし、メモリ使用量とバッテリー寿命への影響を監視することです. おそらく、ファイルシステムの方法がその領域で他の方法よりも明らかに有利であり、それを SQLite に簡単に格納することは、ユースケースにとって価値がないことに気付くでしょう。あるいは、逆の方法を見つけるでしょう。

于 2010-06-07T14:56:32.283 に答える