Saltar al contenido

¿Cómo almacenar la imagen como blob en Sqlite y cómo recuperarla?

Siéntete en la libertad de divulgar nuestros post y códigos con tus amigos, apóyanos para ampliar nuestra comunidad.

Solución:

Aquí el código que usé para mi aplicación.

Este código tomará una imagen de la URL y la convertirá en un byte array

byte[] logoImage = getLogoImage(IMAGEURL);

private byte[] getLogoImage(String url)
     try 
             URL imageUrl = new URL(url);
             URLConnection ucon = imageUrl.openConnection();

             InputStream is = ucon.getInputStream();
             BufferedInputStream bis = new BufferedInputStream(is);

             ByteArrayBuffer baf = new ByteArrayBuffer(500);
             int current = 0;
             while ((current = bis.read()) != -1) 
                  baf.append((byte) current);
             

             return baf.toByteArray();
      catch (Exception e) 
          Log.d("ImageManager", "Error: " + e.toString());
     
     return null;

Para guardar la imagen en db usé este código.

 public void insertUser()
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        String delSql = "DELETE FROM ACCOUNTS";
        SQLiteStatement delStmt = db.compileStatement(delSql);
        delStmt.execute();

        String sql = "INSERT INTO ACCOUNTS (account_id,account_name,account_image) VALUES(?,?,?)";
        SQLiteStatement insertStmt = db.compileStatement(sql);
        insertStmt.clearBindings();
        insertStmt.bindString(1, Integer.toString(this.accId));
        insertStmt.bindString(2,this.accName);
        insertStmt.bindBlob(3, this.accImage);
        insertStmt.executeInsert();
        db.close();

Para recuperar la imagen, este es el código que usé.

public Account getCurrentAccount() 
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    String sql = "SELECT * FROM ACCOUNTS";
    Cursor cursor = db.rawQuery(sql, new String[] );

    if(cursor.moveToFirst())
        this.accId  = cursor.getInt(0);
        this.accName = cursor.getString(1);
        this.accImage = cursor.getBlob(2);
    
    if (cursor != null && !cursor.isClosed()) 
        cursor.close();
    
    db.close();
    if(cursor.getCount() == 0)
        return null;
     else 
        return this;
    

Finalmente, para cargar esta imagen en una vista de imagen

logoImage.setImageBitmap(BitmapFactory.decodeByteArray( currentAccount.accImage, 
        0,currentAccount.accImage.length));

en la clase auxiliar DBAdaper, es decir, la base de datos, declare la tabla de esta manera

 private static final String USERDETAILS=
    "create table userdetails(usersno integer primary key autoincrement,userid text not null ,username text not null,password text not null,photo BLOB,visibility text not null);";

inserte los valores como este,

primero convertir las imágenes como byte[]

ByteArrayOutputStream baos = new ByteArrayOutputStream();  
Bitmap bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.common)).getBitmap();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);   
byte[] photo = baos.toByteArray(); 
db.insertUserDetails(value1,value2, value3, photo,value2);

en la clase DEAdaper

 public long insertUserDetails(String uname,String userid, String pass, byte[] photo,String visibility) 

    ContentValues initialValues = new ContentValues();
    initialValues.put("username", uname);
    initialValues.put("userid",userid);
    initialValues.put("password", pass);
    initialValues.put("photo",photo);
    initialValues.put("visibility",visibility);
    return db.insert("userdetails", null, initialValues);

recuperar la imagen de la siguiente manera

Cursor cur=your query;
while(cur.moveToNext())

     byte[] photo=cur.getBlob(index of blob cloumn);

convertir el byte[] en la imagen

ByteArrayInputStream imageStream = new ByteArrayInputStream(photo);
Bitmap theImage= BitmapFactory.decodeStream(imageStream);

Creo que este contenido puede resolver tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *