2017-10-13 95 views
-1

我能夠將圖像保存在數據庫中。 我現在的問題是檢索它並在代碼中使用它。如何從SQLite數據庫檢索單個圖像

查看我的數據庫處理程序獲得方法:

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

同意在數據庫映像路徑。不建議在SQLite中存儲大塊。 – CommonsWare

+1

借用上述評論。將圖像保存到應用程序的[內部存儲](https://developer.android.com/guide/topics/data/data-storage.html#filesInternal)文件夾中,並保存對數據庫中文件路徑的引用。 –

回答

0

我相信你的問題是,當你檢索BLOB時指定偏移/索引值爲1,即你有cursor.getBlob(1),這將檢索來自STATE_NAME而不是STATE_IMAGE列的字節數組。

遊標的get????()方法的參數是光標中列的偏移量/索引。由於STATE_IMAGE是它的偏移量將沒有1.這樣在光標第三列,下面的工作: -

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)));