Cómo almacenar y recuperar imágenes en la base de datos android de SQLite y mostrarlas en una vista de cuadrícula

Soy nuevo en android. He creado una tabla que tiene un itemName, precio e imagen. Estoy tratando de recuperar los campos de imagen y nombre y mostrarlos en una vista de cuadrícula

Aquí está mi declaración de creación de base de datos:

DBAdapter class onCreate() db.execSQL("CREATE TABLE "+ITEMS_TABLE+" ( "+ COLUMN_ITEM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_ITEM_NAME +" TEXT, "+ COLUMN_ITEM_SPECS +" TEXT, " + COLUMN_ITEM_PRICE + " NUMBER, " + COLUMN_ITEM_IMAGE + " BLOB, " + COLUMN_ITEM_QTY +" NUMBER)"); void AddItems(ItemsPojo itemsObj) { Log.i("in here", "item fields"); SQLiteDatabase db= DBHelper.getWritableDatabase(); if (db==null) { Log.i("nulll", "mnllllsg"); } ContentValues cv=new ContentValues(); cv.put(COLUMN_ITEM_NAME, itemsObj.getItemName()); cv.put(COLUMN_ITEM_SPECS, itemsObj.getItemSpecs()); cv.put(COLUMN_ITEM_PRICE, itemsObj.getItemPrice()); cv.put(COLUMN_ITEM_QTY, itemsObj.getItemQty()); cv.put(COLUMN_ITEM_IMAGE, itemsObj.getItemImg()); long affectedColumnId = db.insert(ITEMS_TABLE, null, cv); db.close(); } public Bitmap getAllImages() { SQLiteDatabase db=DBHelper.getWritableDatabase(); //Cursor cur= db.rawQuery("Select "+colID+" as _id , "+colName+", "+colAge+" from "+employeeTable, new String [] {}); Cursor cur= db.rawQuery("SELECT * FROM "+ITEMS_TABLE,null); //if(cur.getCount() > 0){ //Cursor c = mDb.query(" ... "); cur.moveToFirst(); ByteArrayInputStream inputStream = new ByteArrayInputStream(cur.getBlob(cur.getColumnIndex(COLUMN_ITEM_IMAGE))); Bitmap b = BitmapFactory.decodeStream(inputStream); // } return b; } 

En mi Main Oncreate Yo lleno mi base de datos como esta:

 Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.red_bn); ByteArrayOutputStream out = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.PNG, 100, out); byte[] b = out.toByteArray(); String name; name="QUEEN_BED1"; String specs = "blaBlaBla"; double price = 5420; int qty = 10; ItemsPojo itemsObj = new ItemsPojo(name,specs,price,b,qty); db.AddItems(itemsObj); 

Ahora estoy atascado, por favor, ¿alguien puede ayudarme a recuperar esta imagen y mostrarla en una vista de cuadrícula?

El más eficiente (y btw, el enfoque más directo) es guardar un bytearray de la imagen en su base de datos local. Para eso solo necesitarás usar un tipo de datos TEXTO en tu base de datos. Me gusta esto:

 CREATE TABLE IF NOT EXISTS Your_table ( id INTEGER PRIMARY KEY NOT NULL UNIQUE, someOtherField TEXT, pictureData TEXT); 

Hay una manera perfecta de evitar las conversiones: Simplemente convierta a Bitmap y vuelva a bytearray en sus setters y getters de tal manera que no necesita preocuparse por eso en todo el ciclo de dev. Veamos un ejemplo. Digamos que tienes un usuario de objeto que está almacenado en tu BD local para el que tienes un avatar.

 public class User { private String email; private String name; private Drawable pictureDataDrawable; public User() {} public void setPictureData(byte[] pictureData) { pictureDataDrawable = ImageUtils.byteToDrawable(pictureData); } public byte[] getPictureData(){ return ImageUtils.drawableToByteArray(pictureDataDrawable); } } 

Y dondequiera que recupere sus datos de DB será suficiente con agregar algo como eso:

 user.setPictureData(cursor.getBlob(cursor.getColumnIndexOrThrow(DB_PICTURE_DATA_KEY))); 

Por el contrario (escribiendo el dibujable a DB):

 ContentValues c = new ContentValues(); c.put(DB_PICTURE_DATA_KEY, user.getPictureData()); ... 

Por último, dos métodos fáciles en su ImageUtils para convertir de ida y vuelta:

 public static byte[] drawableToByteArray(Drawable d) { if (d != null) { Bitmap imageBitmap = ((BitmapDrawable) d).getBitmap(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] byteData = baos.toByteArray(); return byteData; } else return null; } public static Drawable byteToDrawable(byte[] data) { if (data == null) return null; else return new BitmapDrawable(BitmapFactory.decodeByteArray(data, 0, data.length)); } 

Y eres bueno para ir.

Depende de cómo quiera almacenar su imagen, ya que está almacenando como un array de bytes aquí es cómo recuperarlo

  public Cursor fetchAll() { return databaseHelper.query(ITEMS_TABLE, new String[] { COLUMN_ITEM_ID, COLUMN_ITEM_NAME, COLUMN_ITEM_SPECS,COLUMN_ITEM_PRICE, COLUMN_ITEM_IMAGE,COLUMN_ITEM_QTY},null, null, null, null, null); } /* this method will give you a cursor with all the records of your database table now you need to parse these records on to objects*/ private List<ItemsPojo> parse(Cursor cursor) { List<ItemsPojo> toReturn = null; toReturn = new ArrayList<SignImage>(); ItemsPojo obj; if (cursor.moveToFirst()) { while (cursor.isAfterLast() == false) { obj = new ItemsPojo(); obj.setId(cursor.getInt(0)); obj.setItemName(cursor.getString(1)); obj.setItemSpecs(cursor.getString(2)); obj.setItemPrice(cursor.getDouble(3)); obj.setItemImg(cursor.getBlob(4)); obj.setItemQuantity(cursor.getInt(5)); toReturn.add(obj); cursor.moveToNext(); } }return toReturn; } 

Ahora tienes una lista con todos tus registros en tu base de datos, ahora lo que tienes que hacer es crear una ListActivity y mostrar todos tus objetos en ella, si no sabes cómo hacerlo, envía tu comentario aquí o si tienes alguna duda Sobre el procedimiento anterior

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.