Cómo almacenar (imagen de mapa de bits) y recuperar la imagen de la base de datos sqlite en android?

En mi proyecto necesito almacenar una imagen en una base de datos sqlite y también necesito recuperarla para demostrar en mi emulador androide. Cuando lo muestro directamente después de decodificar la cadena codificada, que obtuve de la clase Java usando sockets, la imagen se muestra allí. Pero cuando almaceno un código de array de bytes de la cadena en la base de datos sqlite con el blob de tipo de datos y luego lo vuelvo a recuperar usando la función getblob() contiene un valor diferente y este error ocurre:

 JAVA.lang.NULLPointerException: Factory returns null. 

Necesito una sugerencia para almacenar una imagen de mapa de bits en una base de datos sqlite y también para recuperarla de la base de datos sqlite.

2 Solutions collect form web for “Cómo almacenar (imagen de mapa de bits) y recuperar la imagen de la base de datos sqlite en android?”

Configuración de la base de datos

 public class DatabaseHelper extends SQLiteOpenHelper { // Database Version private static final int DATABASE_VERSION = 1; // Database Name private static final String DATABASE_NAME = "database_name"; // Table Names private static final String DB_TABLE = "table_image"; // column names private static final String KEY_NAME = "image_name"; private static final String KEY_IMAGE = "image_data"; // Table create statement private static final String CREATE_TABLE_IMAGE = "CREATE TABLE " + DB_TABLE + "("+ KEY_NAME + " TEXT," + KEY_IMAGE + " BLOB);"; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // creating table db.execSQL(CREATE_TABLE_IMAGE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // on upgrade drop older tables db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE); // create new table onCreate(db); } } 

Insertar en la base de datos:

 public void addEntry( String name, byte[] image) throws SQLiteException{ SQLiteDatabase database = this.getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put(KEY_NAME, name); cv.put(KEY_IMAGE, image); database.insert( DB_TABLE, null, cv ); } 

Recuperación de datos :

  byte[] image = cursor.getBlob(1); 

Nota:

  1. Antes de insertar en la base de datos, debe convertir su imagen de mapa de bits en matriz de bytes primero y luego aplicarlo mediante la consulta de base de datos.
  2. Al recuperar de la base de datos, usted tiene ciertamente una matriz del byte de la imagen, lo que usted necesita hacer es convertir el arsenal del byte de nuevo a la imagen original. Por lo tanto, usted tiene que hacer uso de BitmapFactory para decodificar.

A continuación se muestra una clase Utility que espero pueda ayudarle:

 public class DbBitmapUtility { // convert from bitmap to byte array public static byte[] getBytes(Bitmap bitmap) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.PNG, 0, stream); return stream.toByteArray(); } // convert from byte array to bitmap public static Bitmap getImage(byte[] image) { return BitmapFactory.decodeByteArray(image, 0, image.length); } } 

Otras lecturas
Si no está familiarizado con la inserción y la recuperación en una base de datos, consulte este tutorial .

En el botón haga clic en escribir esto

  Intent in = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); in.putExtra("crop", "true"); in.putExtra("outputX", 100); in.putExtra("outputY", 100); in.putExtra("scale", true); in.putExtra("return-data", true); startActivityForResult(in, 1); 

Luego haz esto en tu actividad

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == RESULT_OK && data != null) { Bitmap bmp = (Bitmap) data.getExtras().get("data"); img.setImageBitmap(bmp); btnadd.requestFocus(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] b = baos.toByteArray(); encodedImageString = Base64.encodeToString(b, Base64.DEFAULT); byte[] bytarray = Base64.decode(encodedImageString, Base64.DEFAULT); Bitmap bmimage = BitmapFactory.decodeByteArray(bytarray, 0, bytarray.length); } } 
  • La manera más rápida y eficiente de pre-poblar la base de datos en Android
  • Android.database.sqlite.SQLiteException: near ": error de sintaxis (código 1):, mientras que la compilación: android error de programación
  • ActiveAndroid Excepción SQLite 'No such table'
  • Error desconocido (código 14): No se pudo abrir la base de datos
  • Cursor while loop devuelve cada valor pero el último
  • Se abren varias bases de datos de Android
  • Número de versión para SQLite DB
  • ¿Cuál es el modo de subprocesamiento predeterminado de SQLite en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.