2011-02-28 27 views
1

仲間のプログラマー!私は新しいです...あなたが助けることを願っています!Android:データベースに画像への参照を保存する

So.私は現在、ユーザーが私のres/drawable /フォルダに保存した画像のセットから4つの異なる画像を選択し、その選択肢をデータベースのエントリとして保存するアプリケーションを開発しています。ユーザーがそれらの4つの画像を要求したときにそれらの4つの画像を再表示できるようにする必要があります。また、私の現在の設定が将来私のために働かないので、画像を保存する最良の方法が何であるか分かりません。

現時点では、私は実際に各イメージのデータベースにR.java int識別子を挿入するように作業しています。データベースにはimg1(int)、img2(int)、img3( int)、img4(int)。その後、私はクエリを書くとき、私はちょうどR.drawable.someImageの代わりにそれらの値を使用します。

正常に動作します。例外を除いて... res/drawableフォルダに新しい画像を追加すると、すべてのdrawable IDが変更されます!その後、私がデータベースに持っているIDは間違っています、そしていくつかは間違ったイメージを引き上げ、いくつかはNullPointerExceptionsをスローします!

これは、ユーザーがダウンロードした後に新しいイメージでアプリケーションを更新できるようにするため、問題です。これらのイメージを動的に選択できるようにするにはどうすればよいでしょうか。

答えて

0

リソースには生データとしてアクセスできます。AssetManager.open(..)を使用して、BitmapFactory.decodeStream(..)を使用してデータストリームからビットマップを作成できます。

画像のファイル名を保存し、上記のコマンドでビットマップをインスタンス化するだけで済みます。

+0

AssetManagersの機能をちょっと説明できますか?私はAPIを見ていましたが、どういうわけか、他のプログラマーよりもずっと長くかかることがわかりました。基本的には、画像を生データとして保存してAssetManagerを使ってそのデータにアクセスすると、識別子が必要ないということですか?ご協力いただきありがとうございます! – Haley

+0

AssetManager:アプリケーションの生アセットファイルへのアクセスを提供します。したがって、任意のリソース/アセットファイル(ビットマップ、XML)を生データストリームとして開くことができます。実際には、これはあなたの場合のように画像にのみ便利です。 –

+0

イメージを特定の方法で保存する必要はありません。イメージをそのまま(* .pngファイル)そのまま残してください。 AssetManagerの名前(「drawable/image.png」など)を指定すると、データストリームが返されます。ファイルを開いてそこからデータを読み込むのと同じです。 –

1

これは、ユーザーがダウンロードした後に新しい画像でアプリを更新できるようにするため、問題です。

私はこれをあまりよく理解していません。ユーザーがあなたのアプリケーションをダウンロードした後に新しいイメージを配布しようとすると、新しいイメージにリソースID(R.javaにあります)これらはビルドプロセスの一部として自動生成されます。

本当にこれを意味するのですか、新しい画像でアプリをアップデートして、ユーザーに再度ダウンロードさせてもらいたいですか?もちろん、この時点で

あなたが定期的に新しいイメージでアプリを更新して、ユーザーが更新アプリをダウンロード持ってしようとしている場合は、あなたが使用して、実行時にリソースIDを見つけることができます...

int resId = getResources.getIdentifier("img1", "drawable", "com.mycompany.mypackagename"); 

、 res/values/strings.xmlの文字列配列で実現できますが、すべてのdrawableの名前を知る必要があります。

しかし、ユーザーがアプリケーションを更新する必要なく新しい画像を追加したい場合は、画像ディレクトリ(SDカードなど)を維持することを考えます。こうすることで、イメージファイルへのパスをDBに保存するだけで済みます。

+0

ええと...私は定期的に新しい画像「パック」を提供するつもりだから、アップデートの形にしなければならないと思う。とにかくアプリの更新方法は?新しいバージョンがダウンロードされましたか?もしそうでなければ、私に教えてください...それは私には今少し日陰のAndroidの別の領域です。 ああ、またgetIdentifier関数を試してみましたが、それもうまくいきますが、リソースにアクセスするのは非効率です。しかし、それは私の唯一のオプションだと思います。ご回答有難うございます! – Haley

+0

@Haley:アプリを更新せずに新しい画像を利用できるようにしたのは、たとえば、あなたのウェブサイトから画像のダウンロードを提供している場合です。つまり、アプリは定期的にあなたのウェブサイトをチェックし、ダウンロードする。この場合、res/drawableのような '内部'のイメージとは異なり、アプリに対する「外部」になります。あなたがそれらを「内部」としてすべて持っているなら、Peter Knegoの答えはgetIdentifier(コードの観点から)を使うよりも良いかもしれませんが、私はそれがより効率的だとは思っていません。 :-) – Squonk

+0

ねえ、ありがとう!私のアプリはあまりリソー​​スを消費しないので、おそらくこの段階で効率についてあまり心配する必要はありません。私はおそらく、生のディレクトリに画像を移動し、データストリームで作業します...私は運がいいですね! – Haley

関連する問題