2012-08-03 22 views
56

En mi proyecto, necesito almacenar una imagen en una base de datos sqlite y también necesito recuperarla para mostrarla en mi emulador de Android. Cuando lo muestro directamente después de decodificar la cadena codificada, que obtuve de la clase Java usando sockets, la imagen aparece allí. Pero cuando almacenar un código de matriz de bytes de la cadena en la base de datos SQLite con el blob tipo de datos y luego otra vez recuperarlo mediante el uso de la función getblob() que contiene un valor diferente y se produce este error:¿Cómo almacenar (imagen de mapa de bits) y recuperar imágenes de la base de datos sqlite en android?

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

es mejor publicar su código aquí –

+0

[sugerencia] (http: // stackoverflow .com/a/9141116/996493) – Lucifer

+1

Chech [esto] (http://stackoverflow.com/questions/4342798/displaying-image-from-the-sqlite-database-using-cursor-in-android). – tolgap

Respuesta

127

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

inserción 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 la inserción en la base de datos, es necesario convertir la imagen de mapa de bits en la matriz de bytes primero y luego aplicarlo mediante consulta a la base.
  2. Al recuperar de la base de datos, sin duda tiene una matriz de bytes de imagen, lo que necesita hacer es convertir la matriz de bytes a la imagen original. Por lo tanto, debe usar BitmapFactory para decodificar.

A continuación se muestra una clase de utilidad que espero que podría ayudarle a:

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


Lectura adicional
Si usted no está familiarizado cómo insertar y recuperar en una base de datos, vaya a través de este tutorial .

+2

@Lazy Ninja, agregue una cita (** "**) antes de ** CREATE TABLE **, no puedo hacer esta edición menor. – Sayka

+1

Thnx para DbBimapUtility – Sayka

+3

@LazyNinja, estoy usando su respuesta para ayudarme a almacenar y recuperar imágenes y cadenas de mapa de bits. ¡Esta publicación es tan útil! Tenía una pregunta sobre cómo "Insertar en la base de datos". En la línea "database.insert (DB_TABLE, null, cv);", ¿cómo está definiendo la base de datos? – Natalie

5

en el botón haga clic en escribir este

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

continuación, hacer esto en su 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); 

     } 

    } 
Cuestiones relacionadas