2011-08-02 6 views
2

ここに最初の投稿がありますので、何か問題がある場合は私にご負担ください。Android:Sqliteが大きなブロブからクラッシュする

私はアプリケーションの画像をsqliteデータベースに保存しようとしています。画像はブロブとして保存する必要があります(これは悪い考えですか?)。そうするコードは次のようになります。

public long createPicture(String title, byte [] thumb, byte [] imageData) { 
    ContentValues data = new ContentValues(); 
    data.put(T_KEY_TITLE, title);    
    data.put(T_KEY_CONTENT, imageData);  // <-- blob in the db 
    data.put(T_KEY_THUMB, thumb); 

    // db is an SQLiteDatabase 
    return db.insert(TABLE_PICS, null, data); // <-- Crash occurs on this line 
} 

このコードは、ほとんどの部分は完璧に動作しますが、私はそれがクラッシュ大きな画像(カメラに内蔵さから5メガピクセル)を格納しようとします。クラッシュするだけでなく、データベースを再構築して、再度起動しようとするとアプリがクラッシュすることもあります。

私の質問です:これを回避する方法はありますか、または大きな画像をファイルとして保存してパスを保存する必要がありますか?また、sqliteをいつ使用するのか、そして単にファイルを入手するのかについての一般的なガイドラインが必要です。

ありがとうございます! :)

+0

クラッシュが少し曖昧です。スタックトレースを取得しましたか?エラーメッセージです。もしそうでなければ、あなたは何かのものを手に入れて投稿することができますか? –

+0

私はAndroid開発の新しさを感じていますが、どこで便利なエラーメッセージが表示されますか?それがクラッシュすると、私は "予期せず停止した"ということを私に与えます。私は実際の電話を使用している、それはスタックトレースを得ることは可能ですか? – Gordy

+0

@Gordy:USB経由で携帯電話に接続し、Android SDKでDDMS(私の好み)のようなものを使って、logcatを監視することができます。 Eclipseを使用している場合は、同じことを行うDDMSパースペクティブがあります。 – Squonk

答えて

2

画像、いつもとベストプラクティスを格納するためにそれらを外部に(SDカード、または他の外部記憶手段に)保存することです。 getExternalStorageDirectory()は大きなファイルを保存する場所を提供し、API 8以上の場合はgetExternalFilesDir()となります。

データベーストランザクションで何らかの不具合が発生している可能性があります(スペースやトランザクションタイムアウトなどが不十分です)。おそらく、画像のURIをDBに格納してから、実際の画像を外部の場所に配置することが最善の方法です。

2

イメージ全体をデータベースに格納することはお勧めしません。その代わりに、イメージのURIまたはパスをデータベースに格納し、実際のイメージデータをコンテンツプロバイダに格納するだけです。

だからあなたの画像を保存するために、それは次のようになります。

Uri u; 
File fi = new File("/sdcard/tmp"); 
try { 
    u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), fi.getAbsolutePath(), null, null)); 
    imageSaveName1 = u.toString(); 

} 

あなたがデータベースにimageSaveName1を格納しますし、その後の使用を取得するために:

Bitmap b = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), imageSaveName1);