web-dev-qa-db-fra.com

Comment stocker (image bitmap) et récupérer l'image de la base de données sqlite dans Android?

Dans mon projet, j'ai besoin de stocker une image dans une base de données sqlite et de la récupérer pour l'afficher dans mon émulateur Android. Lorsque je l'affiche directement après avoir décodé la chaîne codée, que j'ai obtenue de Java utilisant des sockets, l'image y est affichée. Mais lorsque je stocke un code de tableau d'octets de la chaîne dans la base de données sqlite avec le blob de type de données, puis le récupère à nouveau à l'aide de la fonction getblob() function contient une valeur différente et cette erreur se produit:

Java.lang.NULLPointerException: Factory returns null.

J'ai besoin d'une suggestion pour stocker une image bitmap dans une base de données sqlite et également pour la récupérer à partir de la base de données sqlite.

59
Rahul Gautam

Configuration de la base de données

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

Insérer dans la base de données:

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

Récupération de données :

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

Remarque:

  1. Avant de l'insérer dans la base de données, vous devez d'abord convertir votre image Bitmap en tableau d'octets puis l'appliquer à l'aide d'une requête de base de données.
  2. Lors de la récupération d'une base de données, vous avez certainement un tableau d'octets d'image. Ce que vous devez faire est de reconvertir le tableau d'octets en image d'origine. Donc, vous devez utiliser BitmapFactory pour décoder.

Vous trouverez ci-dessous une classe d’utilité qui, je l’espère, pourrait vous aider:

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


Lectures supplémentaires
Si vous ne savez pas comment insérer et récupérer dans une base de données, suivez cette procédure tutoriel .

137
Lazy Ninja

Si vous travaillez avec la base de données MediaStore d'Android, voici comment stocker une image, puis l'afficher après son enregistrement.

cliquez sur le bouton pour écrire ceci

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

alors fais ceci dans ton activité

@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();
            String encodedImageString = Base64.encodeToString(b, Base64.DEFAULT);

            byte[] bytarray = Base64.decode(encodedImageString, Base64.DEFAULT);
            Bitmap bmimage = BitmapFactory.decodeByteArray(bytarray, 0,
                    bytarray.length);

        }

    }
7
Yash