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