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:
- Cómo convertir Bitmap Object a Image Object y viceversa en android 'java'
- Android: crear animaciones a partir de imágenes fijas
- Cómo seleccionar y recortar una imagen en android?
- Transparencia de la imagen de Android
- Java.io.FileNotFoundException en android
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]
- Cómo obtener URL de enlace en Android WebView con HitTestResult para una imagen vinculada (y no la URL de imagen) con Longclick
- ¿Alguien ha hecho una "animación de escaneo" básica en una imagen?
- ¿Cómo obtener el progreso de subida al cargar datos desde Byte Array a un servidor PHP?
- Fondo de pantalla en vivo con imágenes
- Colocar la imagen en las coordenadas de Android
- Rotar un pivote de imagen en el Centro - Android
- Vista de la imagen de Android desde url
- Android procesamiento de imágenes de alta resolución
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);
- Creación de un botón en la barra de herramientas de Android
- Permiso de comprobación de Android para LocationManager