Dans mon application, je télécharge une image de 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 suis en train de convertir une image bitmap en chaîne et de l'enregistrer dans la base de données. Lors de la récupération de la base de données, je ne peux pas affecter cette chaîne à ImageView car il s'agit d'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");
//i am getting error as i cant assign string to imageview.
}
buttonLoadImage.setOnClickListener(new Button.OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
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 Auto-generated method stub
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("firstimage........", "" + i1);
targetImage.setVisibility(0);
SQLiteDatabase db = database.getWritableDatabase();
db.execSQL("INSERT INTO UPLOAD VALUES('" + i1 + "');");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
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 Auto-generated method stub
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 Auto-generated constructor stub
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return IMAGE.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
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;
}
}
}
}
}
Vous devez utiliser "blob" pour stocker l'image.
ex: pour stocker une image dans la base de données:
public void insertImg(int id , Bitmap img ) {
byte[] data = getBitmapAsByteArray(img); // this is a function
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;
}
Utilisez blob pour stocker votre image dans votre base de données sqlite. Vous trouverez ci-dessous un exemple d'utilisation de blob.
Configuration 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 de données:
byte[] image = cursor.getBlob(1);
Note:
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);
}
}
Je pense que le meilleur moyen 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 d'exemple complet Android à l'adresse suivante: http://developersfound.com/Base64FromStream.Zip . Ce programme ne stocke pas l'image, mais il convertit l'image de l'image en texte et inversement.
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", "Could not load Bitmap from: " + url);
} finally {
//closeStream(in);
try {
in.close();
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
//closeStream(out);
try {
out.close();
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
return bitmap;
}
private void copyCompletely(InputStream input, OutputStream output) throws IOException {
// if both are file streams, use channel IO
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) { /* failover to byte stream version */
}
}
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;
}
};
}
Pour stocker une image dans une base de données sqlite, vous devez stocker cette image dans un tableau d'octets au lieu de chaîne. Convertissez cette image en tableau d'octets et stockez cet octet [] en base de données. Lors de la récupération de cette image, vous obtiendrez octet [] convertir cet octet [] en image bitmap par laquelle vous obtiendrez une image originale.
J'ai deux choses à noter. Comment stocker une image de la galerie et comment stocker une image de uri, par exemple (www.example.com/myimage.png)
Comment stocker une image de la galerie
Les images sont extraites de la galerie en indiquant le type de données Uri. Afin de stocker les images dans la base de données Android SQLite, vous devez convertir l'URI de l'image en bitmap, puis en caractères binaires, séquence octets []. Définissez ensuite le type de données de la colonne de 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 imageview.
comment stocker l'image de uri.
Notez que vous pouvez stocker des images dans la base de données sous forme de chaîne uri mais uniquement d'image uri provenant d'un site Web. Convertissez l'URI en chaîne et insérez-le dans votre base de données. Récupérez votre image uri sous forme de chaîne et convertissez-la en type de données uri afin de la définir comme imageview.
Vous pouvez essayer ce post pour le programme travaillé et code source comment stocker des images dans une base de données SQLite et les afficher dans listview