101 votes

Comment stocker une image dans une base de données SQLite

Dans mon application, je charge une image depuis la galerie et je veux stocker cette image dans la base de données SQLite. Comment stocker un bitmap dans la base de données? Je convertis le bitmap en une chaîne et je la sauvegarde dans la base de données. Lorsque je la récupère depuis la base de données, je ne parviens pas à assigner cette chaîne à ImageView car c'est une chaîne.

Imageupload12.java:

 public class Imageupload12 extends Activity {
      Button buttonLoadImage;
      ImageView targetImage;
      int i = 0;
      Database database = new Database(this);
      String i1;
      String img;
      @Override
      public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main5);
       buttonLoadImage = (Button) findViewById(R.id.loadimage);
       targetImage = (ImageView) findViewById(R.id.targetimage);

       Bundle b = getIntent().getExtras();
       if (b != null) {
        img = b.getString("image");
        targetImage2.setImageURI("image");
        // j'obtiens une erreur car je ne peux pas assigner une chaîne à ImageView.

       }

       buttonLoadImage.setOnClickListener(new Button.OnClickListener() {

        public void onClick(View arg0) {
         // TODO - implémenter la méthode
         Intent intent = new Intent(Intent.ACTION_PICK,
          android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
         Log.i("photo", "" + intent);
         startActivityForResult(intent, i);
         i = i + 1;
        }
      });

      }

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {

       // TODO - implémenter la méthode
       super.onActivityResult(requestCode, resultCode, data);
       switch (requestCode) {

        case 0:
         if (resultCode == RESULT_OK) {
          Uri targetUri = data.getData();
          //             textTargetUri.setText(targetUri.toString());
          Bitmap bitmap;
          try {
           bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
           targetImage.setImageBitmap(bitmap);

           i1 = bitmap.toString();
           Log.i("première image........", "" + i1);
           targetImage.setVisibility(0);

           SQLiteDatabase db = database.getWritableDatabase();
           db.execSQL("INSERT INTO UPLOAD VALUES('" + i1 + "');");

          } catch (FileNotFoundException e) {
           // TODO - implémenter la méthode
           e.printStackTrace();
          }
         }
         break;

       }

      }
     }

Image.class:

 public class Image extends Activity {
     Database database = new Database(this);
     static EfficientAdapter adapter, adapter1;
     static ListView lv1;

     static SQLiteDatabase db;
     static EfficientAdapter adp;
     static Cursor c1;

     static Vector < String > IMAGE = new Vector < String > ();

     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      db = database.getReadableDatabase();
      c1 = db.rawQuery("select * from UPLOAD;", null);

      if (c1.moveToFirst()) {

       do {
        IMAGE.add(c1.getString(0).toString());

       } while (c1.moveToNext());

       c1.close();
      }

      lv1 = (ListView) findViewById(R.id.List);

      adapter = new EfficientAdapter(this);

      lv1.setAdapter(adapter);

      ImageView add = (ImageView) findViewById(R.id.imv1a);

      add.setOnClickListener(new OnClickListener() {

       @Override
       public void onClick(View v) {
        // TODO - implémenter la méthode
        IMAGE.clear();

        Intent i = new Intent(Image.this, Imageupload12.class);
        startActivity(i);

       }
      });

     }

     private static class EfficientAdapter extends BaseAdapter {

      //        protected  final Context Context = null;
      protected LayoutInflater mLayoutInflater;
      AlertDialog.Builder aBuilder;
      public EfficientAdapter(Context context) {
       // TODO - implémenter le constructeur
       mLayoutInflater = LayoutInflater.from(context);
      }

      @Override
      public int getCount() {
       // TODO - implémenter la méthode

       return IMAGE.size();
      }

      @Override
      public Object getItem(int position) {
       // TODO - implémenter la méthode
       return position;
      }

      @Override
      public long getItemId(int position) {
       // TODO - implémenter la méthode
       return position;
      }

      @Override
      public View getView(final int position, View convertView, ViewGroup parent) {
       // TODO - implémenter la méthode

       final ViewHolder mVHolder;
       if (convertView == null) {
        convertView = mLayoutInflater.inflate(R.layout.pjtlistdetails, parent, false);

        mVHolder = new ViewHolder();

        mVHolder.t1 = (TextView) convertView.findViewById(R.id.pjtdetails);
        mVHolder.time = (TextView) convertView.findViewById(R.id.name);

        mVHolder.imv = (ImageButton) convertView.findViewById(R.id.editic);
        mVHolder.imvd = (ImageView) convertView.findViewById(R.id.delete);
        mVHolder.imvf = (ImageView) convertView.findViewById(R.id.fwd);

        mVHolder.imv.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {

          String img = IMAGE.elementAt(position);
          Log.i("image...", "" + img);

          Context ctx = v.getContext();
          Intent myIntent = new Intent();
          ctx = v.getContext();
          myIntent.setClass(ctx, Imageupload12.class);
          myIntent.putExtra("image", img);

          ctx.startActivity(myIntent);

          IMAGE.clear();

         }
        });
        static class ViewHolder {

         ImageButton imv;
         ImageView imvd, imvf;
        }
       }
      }
     }
    }

137voto

Jram Points 1468

Vous devez utiliser "blob" pour stocker une image.

ex: pour stocker une image dans la base de données:

public void insertImg(int id , Bitmap img ) {   

    byte[] data = getBitmapAsByteArray(img); // c'est une fonction

    insertStatement_logo.bindLong(1, id);       
    insertStatement_logo.bindBlob(2, data);

    insertStatement_logo.executeInsert();
    insertStatement_logo.clearBindings() ;

}

 public static byte[] getBitmapAsByteArray(Bitmap bitmap) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.PNG, 0, outputStream);       
    return outputStream.toByteArray();
}

Pour récupérer une image de la base de données:

public Bitmap getImage(int i){

    String qu = "select img  from table where feedid=" + i ;
    Cursor cur = db.rawQuery(qu, null);

    if (cur.moveToFirst()){
        byte[] imgByte = cur.getBlob(0);
        cur.close();
        return BitmapFactory.decodeByteArray(imgByte, 0, imgByte.length);
    }
    if (cur != null && !cur.isClosed()) {
        cur.close();
    }       

    return null;
}

38voto

Lazy Ninja Points 6921

Utilisez blob pour stocker votre image dans votre base de données sqlite. Voici un exemple de comment utiliser blob.

Mise en place de la base de données

CREATE TABLE " + DB_TABLE + "("+ 
                   KEY_NAME + " TEXT," + 
                   KEY_IMAGE + " BLOB);";

Insérer dans la base de données:

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

Récupération des données:

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

Remarque:

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

Voici une classe utilitaire qui j'espère pourra vous aider:

public class DbBitmapUtility {

    // convertir de bitmap en tableau de bytes
    public static byte[] getBytes(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.PNG, 0, stream);
        return stream.toByteArray();
    }

    // convertir de tableau de bytes en bitmap
    public static Bitmap getImage(byte[] image) {
        return BitmapFactory.decodeByteArray(image, 0, image.length);
    }
}

5voto

Sumant Points 1658

Pour stocker n'importe quelle image dans une base de données sqlite, vous devez stocker cette image sous forme de tableau d'octets au lieu de chaîne de caractères. Convertissez cette image en tableau d'octets et stockez ce byte [] dans la base de données. Lors de la récupération de cette image, vous obtiendrez un byte [] convertissez ce byte [] en bitmap avec lequel vous obtiendrez l'image d'origine.

4voto

user2288580 Points 41

Je crois que la meilleure façon de stocker une image dans une base de données SQLLite est d'utiliser l'algorithme Base 64, qui convertit une image en texte brut et inversement. Vous pouvez télécharger le projet Android complet à l'adresse suivante : www.developersfound.com/Base64FromStream.zip. Ce programme ne stocke pas l'image mais il convertit l'image de l'image en texte et inversement. Le lien de téléchargement ci-dessus contient la version du code Kotlin ci-dessous.

Voici la classe :

package com.example.TestProject;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import android.util.Log;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.nio.channels.FileChannel;

public class Base64CODEC {
    private int IO_BUFFER_SIZE = 64;
    //private int IO_BUFFER_SIZE = 8192;
    private URL urlObject = null;
    private URLConnection myConn = null;
    ByteArrayOutputStream os = null;

    public void Base64CODEC() {}

    public Bitmap Base64ImageFromURL(String url) {
        Bitmap bitmap = null;
        InputStream in = null;
        BufferedOutputStream out = null;

        try {
            urlObject = new URL(url);
            myConn = urlObject.openConnection();
            in = myConn.getInputStream();

            final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
            out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);

            copyCompletely(in, out);

            final byte[] data = dataStream.toByteArray();
            BitmapFactory.Options options = new BitmapFactory.Options();

            bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);
        } catch (IOException e) {
            Log.e("TAG", "Impossible de charger l'image à partir de : " + url);
        } finally {
            //closeStream(in);
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();  //Pour modifier le corps de l'instruction catch, utilisez Fichier | Paramètres | Modèles de fichier.
            }
            //closeStream(out);
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();  //Pour modifier le corps de l'instruction catch, utilisez Fichier | Paramètres | Modèles de fichier.
            }
        }

        return bitmap;
    }

    private void copyCompletely(InputStream input, OutputStream output) throws IOException {
        // si ce sont tous les deux des flux de fichiers, utilisez l'entrée-sortie du canal
        if ((output instanceof FileOutputStream) && (input instanceof FileInputStream)) {
            try {
                FileChannel target = ((FileOutputStream) output).getChannel();
                FileChannel source = ((FileInputStream) input).getChannel();

                source.transferTo(0, Integer.MAX_VALUE, target);

                source.close();
                target.close();

                return;
            } catch (Exception e) { /* basculement vers la version du flux de bytes */}
        }

        byte[] buf = new byte[8192];
        while (true) {
            int length = input.read(buf);
            if (length < 0)
                break;
            output.write(buf, 0, length);
        }

        try {
            input.close();
        } catch (IOException ignore) {
        }
        try {
            output.close();
        } catch (IOException ignore) {}
    }

    public String convertToBase64(Bitmap bitmap) {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG,100,os);
        byte[] byteArray = os.toByteArray();
        return Base64.encodeToString(byteArray, 0);
    }

    public Bitmap convertToBitmap(String base64String) {
        byte[] decodedString = Base64.decode(base64String, Base64.DEFAULT);
        Bitmap bitmapResult = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
        return bitmapResult;
    }

}

Et voici l'activité principale qui utilise la classe :

package com.example.TestProject;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends Activity implements Runnable {

    private Thread thread = null;
    private Bitmap bitmap = null;
    private Base64CODEC base64CODEC = null;
    private ImageView imgViewSource = null;
    private ImageView imgViewDestination = null;
    private boolean isSourceImageVisible = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void CmdLoadImage_Click(View view) {
        try {
            if(isSourceImageVisible == true) {
                imgViewSource.setImageBitmap(null);
                imgViewDestination.setImageBitmap(null);
                isSourceImageVisible = false;
            }
            else {
                base64CODEC = new Base64CODEC();
                thread = new Thread(this);
                thread.start();
            }
        }
        catch (NullPointerException e) {}

    }

    public void CmdEncodeImage_Click(View view) {
        Base64CODEC base64CODEC = new Base64CODEC();
        try {
            String base64String = base64CODEC.convertToBase64(bitmap);
            imgViewDestination = (ImageView) findViewById(R.id.imgViewDestination);
            Bitmap imgViewDestinationBitmap = base64CODEC.convertToBitmap(base64String);
            imgViewDestination.setImageBitmap(imgViewDestinationBitmap);
        }
        catch (NullPointerException e) {
            //
        }
    }

    @Override
    public void run() {
        bitmap = base64CODEC.Base64ImageFromURL("http://developersfound.com/me.png");
        handler.sendEmptyMessage(0);
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            imgViewSource = (ImageView) findViewById(R.id.imgViewSource);
            imgViewSource.setImageBitmap(bitmap);
            isSourceImageVisible = true;
            thread = null;
        }
    };

}

2voto

Daniel Nyamasyo Points 981

J'ai deux choses à noter. Comment stocker une image de la galerie et comment stocker une image à partir d'une uri par exemple (www.example.com/myimage.png)

Comment stocker une image de la galerie

Les images sont récupérées de la galerie sous forme de données Uri. Pour stocker des images dans une base de données SQLite Android, vous devez convertir l'URI de l'image en bitmap, puis en caractères binaires, c'est-à-dire en une séquence de bytes[]. Ensuite, définissez le type de données de la colonne de la table en tant que type de données BLOB. Après avoir récupéré les images de la base de données, convertissez le type de données byte[] en bitmap afin de le définir sur un imageview.

Comment stocker une image à partir d'une uri.

Notez que vous pouvez stocker des images dans la base de données en tant que chaîne d'URI, mais seulement l'URI d'une image d'un site Web. Convertissez l'URI en chaîne et insérez-le dans votre base de données. Récupérez votre URI d'image en tant que chaîne et convertissez-le en type de données uri afin de le définir sur un imageview.

Vous pouvez essayer ce post pour un programme fonctionnel et code source sur comment stocker des images dans une base de données SQLite et les afficher dans une listview

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X