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.

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); } } 
  • ¿Cómo actualizar el esquema de la tabla después de una actualización de la aplicación en Android?
  • El tacto de la firma de la lona crea la edición en teléfono
  • ¿Es Parse.com un servicio adecuado para la copia de seguridad / sincronización con SQLite en Android?
  • SQLite: No se puede enlazar argumento en el índice 1 porque el índice está fuera de rango. La sentencia tiene 0 parámetros
  • implementar el marco de sincronización de Microsoft con el dispositivo Android
  • ¿Puede un proyecto de biblioteca de Android tener su propia base de datos SQLite?
  • Aclaración sobre el row_id devuelto por la instrucción de inserción de sqlite
  • Base de datos SQLite de Android compartida entre actividades
  • Sugar ORM para Android no puede encontrar el nombre de mi columna
  • Bucle a través de un Cursor SQLite lleva demasiado tiempo
  • Protección de bases de datos SQLite locales (aplicación Android)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.