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

Quiero almacenar una imagen (de url) en una base de datos sqlite.

Para eso uso:

db = new DataBase(getApplicationContext()); URL url = new URL("http://sree.cc/wp-content/uploads/schogini_team.png"); URLConnection ucon = url.openConnection(); InputStream is = ucon.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is,128); ByteArrayBuffer barb= new ByteArrayBuffer(128); int current = 0; while ((current = bis.read()) != -1) { barb.append((byte) current); } ContentValues filedata= new ContentValues(); filedata.put(DataBase.IMG_SRC,barb.toByteArray()); db.insert(DataBase.Table_Img, null, filedata); 

En el Insert() :

 public void insert(String tableImg, Object object, ContentValues dataToInsert) { // TODO Auto-generated method stub String sql = "INSERT INTO "+tableImg+" ("+ID+","+IMG_SRC+") " + "VALUES ('"+1+"','"+dataToInsert+"')"; db.execSQL(sql); } 

Para la recuperación de la imagen:

 Cursor cursor = db.selectDataToShow(DataBase.Table_Img, DataBase.IMG_SRC); byte[] imageByteArray=cursor.getBlob(cursor.getColumnIndex(DataBase.IMG_SRC)); cursor.close(); ByteArrayInputStream imageStream = new ByteArrayInputStream(imageByteArray); Bitmap theImage = BitmapFactory.decodeStream(imageStream); System.out.println(">>>>>>>>>>>>>>>>>>>>>> "+theImage); 

Así que aquí tengo null .

Y en mi base de datos el valor de la imagen almacenada como: Image=[B@43e5ac48]

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

Este código tomará una imagen de url y convertirá a un array de bytes

 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 utilicé 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 de nuevo este es el código que he usado.

 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 a una vista de imagen

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

En el DBAdaper, es decir, la clase auxiliar de base de datos declarar la tabla como esta

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

Insertar los valores como este,

Primero convierte 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 como sigue

 Cursor cur=your query; while(cur.moveToNext()) { byte[] photo=cur.getBlob(index of blob cloumn); } 

Convertir el byte [] en imagen

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

Creo que este contenido puede resolver su problema

En el inserto ()

 public void insert(String tableImg, Object object, ContentValues dataToInsert) { db.insert(tablename, null, dataToInsert); } 

Espero que te ayude.

Puede comprobar aquí para insertar imagen en la base de datos:

Es útil para mí:

Usted también puede querer codificar y decodificar a / desde base64

  function uncompress(str:String):ByteArray { import mx.utils.Base64Decoder; var dec:Base64Decoder = new Base64Decoder(); dec.decode(str); var newByteArr:ByteArray=dec.toByteArray(); return newByteArr; } // Compress a ByteArray into a Base64 String. function compress(bytes:ByteArray):String { import mx.utils.Base64Decoder; //Transform String in a ByteArray. import mx.utils.Base64Encoder; //Transform ByteArray in a readable string. var enc:Base64Encoder = new Base64Encoder(); enc.encodeBytes(bytes); return enc.drain().split("\n").join(""); } 

Para un proyecto iónico


     Var imgURI = "";
     Var imgBBDD = "";  // sqllite para guardar en

     Función takepicture () {
                 Var options = {
                     Calidad: 75,
                     DestinationType: Camera.DestinationType.DATA_URL,
                     SourceType: Camera.PictureSourceType.CAMERA,
                     AllowEdit: true,
                     EncodingType: Camera.EncodingType.JPEG,
                     TargetWidth: 300,
                     TargetHeight: 300,
                     PopoverOptions: CameraPopoverOptions,
                     SaveToPhotoAlbum: false
                 };

                 $ CordovaCamera.getPicture (opciones) .then (function (imageData) {
                     ImgURI = "datos: image / jpeg; base64," + imageData;
                     ImgBBDD = imageData;
                 }, Function (err) {
                     // Ocurrió un error.  Mostrar un mensaje al usuario
                 });
             }

Y ahora ponemos imgBBDD en SqlLite


      Función saveImage = función (theId, theimage) {
       Var insertQuery = "INSERT INTO imágenes (id, imagen) VALUES (" + theId + ", '" + theimage + "');"
       Console.log ('>>>>>>>');
       DDBB.SelectQuery (insertQuery)
                     .then (function (resultado) {
                         Console.log ("Imagen guardada");
                     })
                     .catch (función (err) 
                      {
                         Deferred.resolve (err);
                         Return cb (err);
                     });
     }

Un lado del servidor (php)


         $ Request = file_get_contents ("php: // input");  // obtiene los datos sin procesar
         $ Dades = json_decode ($ request, true);  // true para devolver como array


     If ($ dades == "") {
             $ Array = array ();
             $ Array ['error'] = -1;
             $ Array ['descError'] = "Error al obtener el archivo";
             $ Array ['logError'] = '';
             Echo json_encode ($ array);
             salida;
         }
         // enviar de nuevo la imagen al cliente
         Encabezado ('Content-Type: image / jpeg');
         eco '';

 byte[] byteArray = rs.getBytes("columnname"); Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0 ,byteArray.length); 
  • Combinar imágenes en android
  • Facebook Compartir imagen Url junto con el enlace en android
  • Android - cómo configurar la imagen de fondo de pantalla
  • Obtener imágenes redimensionadas dentro de los botones de Android
  • Android: mapa de bits baja escala de baja calidad
  • Android: reducción de la calidad de los píxeles en las imágenes cargadas en WebView
  • ¿Cómo implementar el efecto de zoom para la vista de imagen en android?
  • Programaticamente cambiar drawableLeft de botón
  • Problemas de calidad al cambiar el tamaño de una imagen en tiempo de ejecución
  • Dibuja parte de la imagen a la pantalla (sin cargar todo a la memoria)
  • Esquinas redondeadas en ImageView en la fila ListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.