2017-10-13 10 views
-1

データベースにイメージを保存することができます。 私が今持っている問題は、それを取得してコード内で使用することです。私のデータベースハンドラでSQLiteデータベースから1つのイメージを取得する方法

ルックメソッドを取得:私が主な活動で使用されるコードで

ImageClass getImage(int state_id) { 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(DATABASE_TABLE_NAME, new String[]{STATE_ID, STATE_NAME, STATE_IMAGE}, STATE_ID + "=?", 
      new String[]{String.valueOf(state_id)}, null, null, null, null); 
    if (cursor != null); 
    cursor.moveToFirst(); 

     ImageClass imageClass = new ImageClass(Integer.parseInt(cursor.getString(0)), 
       cursor.getString(1), cursor.getBlob(1)); 

     cursor.close(); 



    return imageClass; 
} 

ルックを..

btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ImageClass imageClass = db.getImage(); 
      byte[]in = imageClass._image; 
       Bitmap imah = Utils.getImage(in); 


       img.setImageBitmap(imah); 

      } 
     }); 
    } catch(IOException e) { 
     System.out.println(e); 
    } 
} 

これは

public class ImageClass { 
int _id; 
byte[] _image; 
String _state_name; 


public ImageClass(){ 

} 

public ImageClass(int state_id,String state_name, byte[] state_image) { 
    this._id = state_id; 
    this._state_name = state_name; 
    this._image = state_image; 

} 

public ImageClass(String state_name, byte[]state_image){ 
    this._state_name = state_name; 
    this._image = state_image; 
} 
public ImageClass(int state_id, byte[]state_image){ 
    this._id = state_id; 
    this._image= state_image; 
} 

public int get_id() { 
    return this._id; 
} 

public void set_id(int state_id) { 
    this._id = state_id; 
} 

public byte[] get_image() { 
    return this._image; 
} 

public void set_image(byte[] state_image) { 
    this._image = state_image; 
} 

public String get_state_name() { 
    return this._state_name; 
} 

public void set_state_name(String set_state_name) { 
    this._state_name = set_state_name; 
} 

その私のイメージの活動でありますそれ以来私は本当にイライラしています。 多くのことをオンラインで試してみましたが、正しい方法を見つけることができませんでした...

+4

正しい方法は、データベース内の画像のパスを格納することである代わりに、画像ファイル –

+2

は、合意されました。大きなblobをSQLiteに格納することはお勧めしません。 – CommonsWare

+1

上記のコメントを締めくくる。アプリの[内部ストレージ](https://developer.android.com/guide/topics/data/data-storage.html#filesInternal)フォルダに画像を保存し、代わりにデータベースのファイルのパスへの参照を保存します。 –

答えて

0

私はあなたの問題は、BLOBを取得するときにオフセット/インデックス値1を指定していると言います。つまり、cursor.getBlob(1)からのバイト配列STATE_NAMESTATE_IMAGEの列。

Cursorのget????()メソッドのパラメータは、Cursorの列に対するオフセット/インデックスです。 STATE_IMAGEは、このようにない1になります。オフセットだCursorの中で3番目の列であるため、次のように動作します: -

cursor.getBlob(2)

をただし、あなたが発見したとして、非常に簡単になることがオフセットを使用しますエラーが発生しました。カーソルgetColumnIndexメソッドを使用して列名を使用すると、エラーが少なくなり、コードをより簡単に管理できます。これを使用すると以下の行になります。 -

cursor.getBlob(csr.getColumnIndex(STATE_IMAGE))

私は変更をお勧めしたい: -

ImageClass imageClass = new ImageClass(Integer.parseInt(cursor.getString(0)), 
      cursor.getString(1), cursor.getBlob(1)); 

へ: -

ImageClass imageClass = new ImageClass(Integer.parseInt(cursor.getString(cursor.getColumnIndex(STATE_ID)), 
      cursor.getString(cursor.getColumnIndex(STATE_NAME)), cursor.getBlob(cursor.getColumnIndex(STATE_IMAGE))); 
関連する問題