web-dev-qa-db-fra.com

comment enregistrer Image en tant qu'objet dans Sqlite et comment le récupérer

Je veux stocker une image (à partir de l'URL) dans une base de données SQLite.

Pour cela j'utilise: 

db = new DataBase(getApplicationContext());
URL url = new URL("http://sree.cc/wp-content/uploads/schogini_team.png");
URLConnection ucon = url.openConnection();
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is,128);
ByteArrayBuffer barb= new ByteArrayBuffer(128);

int current = 0;
while ((current = bis.read()) != -1) {
    barb.append((byte) current);
}

ContentValues filedata= new ContentValues();

filedata.put(DataBase.IMG_SRC,barb.toByteArray());

db.insert(DataBase.Table_Img, null, filedata);

Dans la Insert():

public void insert(String tableImg, Object object,
        ContentValues dataToInsert) {
    // TODO Auto-generated method stub
    String sql = "INSERT INTO "+tableImg+" ("+ID+","+IMG_SRC+") " +
            "VALUES ('"+1+"','"+dataToInsert+"')";
    db.execSQL(sql);
}

Pour la récupération de l'image:

Cursor cursor = db.selectDataToShow(DataBase.Table_Img, DataBase.IMG_SRC);

byte[] imageByteArray=cursor.getBlob(cursor.getColumnIndex(DataBase.IMG_SRC));      
cursor.close();

ByteArrayInputStream imageStream = new ByteArrayInputStream(imageByteArray);
Bitmap theImage = BitmapFactory.decodeStream(imageStream);

System.out.println(">>>>>>>>>>>>>>>>>>>>>> "+theImage);

Donc ici, j'ai null.

Et dans ma base de données, la valeur de l'image stockée sous la forme: Image=[B@43e5ac48]

71
Siten

Voici le code que j'ai utilisé pour mon application

Ce code prendra une image de l'URL et convertira en tableau d'octets

byte[] logoImage = getLogoImage(IMAGEURL);

private byte[] getLogoImage(String url){
     try {
             URL imageUrl = new URL(url);
             URLConnection ucon = imageUrl.openConnection();

             InputStream is = ucon.getInputStream();
             BufferedInputStream bis = new BufferedInputStream(is);

             ByteArrayBuffer baf = new ByteArrayBuffer(500);
             int current = 0;
             while ((current = bis.read()) != -1) {
                     baf.append((byte) current);
             }

             return baf.toByteArray();
     } catch (Exception e) {
             Log.d("ImageManager", "Error: " + e.toString());
     }
     return null;
}

Pour enregistrer l'image sur db j'ai utilisé ce code.

    public void insertUser(){
    SQLiteDatabase db               =   dbHelper.getWritableDatabase();

    String delSql                       =   "DELETE FROM ACCOUNTS";
    SQLiteStatement delStmt         =   db.compileStatement(delSql);
    delStmt.execute();

    String sql                      =   "INSERT INTO ACCOUNTS (account_id,account_name,account_image) VALUES(?,?,?)";
    SQLiteStatement insertStmt      =   db.compileStatement(sql);
    insertStmt.clearBindings();
    insertStmt.bindString(1, Integer.toString(this.accId));
    insertStmt.bindString(2,this.accName);
    insertStmt.bindBlob(3, this.accImage);
    insertStmt.executeInsert();
    db.close();
}

Pour récupérer l'image, c'est le code que j'ai utilisé.

public Account getCurrentAccount() {
    SQLiteDatabase db       =   dbHelper.getWritableDatabase();
    String sql              =   "SELECT * FROM ACCOUNTS";
    Cursor cursor           =   db.rawQuery(sql, new String[] {});

    if(cursor.moveToFirst()){
        this.accId             = cursor.getInt(0);
        this.accName           = cursor.getString(1);
        this.accImage          = cursor.getBlob(2);
    }
    if (cursor != null && !cursor.isClosed()) {
        cursor.close();
    }
    db.close();
    if(cursor.getCount() == 0){
        return null;
    } else {
        return this;
    }
}

Enfin pour charger cette image dans une imageview

logoImage.setImageBitmap(BitmapFactory.decodeByteArray( currentAccount.accImage, 
        0,currentAccount.accImage.length));
64
blessenm

dans la classe d'assistance DBAdaper i.e Data Base, déclarez la table comme ceci

 private static final String USERDETAILS=
    "create table userdetails(usersno integer primary key autoincrement,userid text not null ,username text not null,password text not null,photo BLOB,visibility text not null);";

insérez les valeurs comme ceci,

convertit d'abord les images en octet []

ByteArrayOutputStream baos = new ByteArrayOutputStream();  
Bitmap bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.common)).getBitmap();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);   
byte[] photo = baos.toByteArray(); 
db.insertUserDetails(value1,value2, value3, photo,value2);

dans la classe DEAdaper

 public long insertUserDetails(String uname,String userid, String pass, byte[] photo,String visibility) 
{
    ContentValues initialValues = new ContentValues();
    initialValues.put("username", uname);
    initialValues.put("userid",userid);
    initialValues.put("password", pass);
    initialValues.put("photo",photo);
    initialValues.put("visibility",visibility);
    return db.insert("userdetails", null, initialValues);
}

récupérer l'image comme suit

Cursor cur=your query;
while(cur.moveToNext())
{
     byte[] photo=cur.getBlob(index of blob cloumn);
}

convertir l'octet [] en image

ByteArrayInputStream imageStream = new ByteArrayInputStream(photo);
Bitmap theImage= BitmapFactory.decodeStream(imageStream);

Je pense que ce contenu peut résoudre votre problème

21
Balaji.K

Dans insert ()

public void insert(String tableImg, Object object,
        ContentValues dataToInsert) {

   db.insert(tablename, null, dataToInsert);
}

J'espère que ça vous aide.

1
Nishant Shah

pour un projet ionique


 var imgURI = ""; 
 var imgBBDD = ""; // sqllite for save into 

 fonction takepicture () {
 var options = {
 qualité: 75, 
 destinationType: Camera.DestinationType.DATA_URL, 
 sourceType: Camera.PictureSourceType.CAMERA, 
 allowEdit: vrai, 
 encodingType: Camera.EncodingType.JPEG, 
 targetWidth: 300, 
 targetHeight: 300, 
 popoverOptions: CameraPopoverOptions, 
 saveToPhotoAlbum: false 
 }; 

 $ cordovaCamera.getPicture (options) .then (function (imageData) {
 imgURI = "data: image/jpeg; base64," + imageData; 
 imgBBDD = imageData; 
}, function (err) { 
 // Une erreur est survenue. Afficher un message à l'utilisateur 
}); 
 } 

Et maintenant, nous mettons imgBBDD dans SqlLite


 function saveImage = function (theId, theimage) {
 var insertQuery = "INSERT INTO images (id, image) VALEURS (" + theId + ", '" + theimage + "');" 
 console.log ('>>>>>>>'); 
 DDBB.SelectQuery (insertQuery) 
 .then (function (result) {
 console.log ("Image enregistrée"); 
}) 
 .catch (function (err) 
 {
 deferred.resolve (err); 
 return cb (err); 
}); 
 } 

Un côté serveur (php)


 $ request = file_get_contents ("php: // input"); // récupère les données brutes 
 $ dades = json_decode ($ request, true); // true pour le retour sous forme de tableau 


 if ($ dades == "") {
 $ array = array (); 
 $ array ['error'] = -1; 
 $ array ['descError'] = "Erreur lors de l'extraction du fichier"; 
 $ array ['logError'] = ''; 
 echo json_encode ($ array); 
 sortie;
 } 
 // envoie à nouveau l'image au client 
 en-tête ('Type de contenu: image/jpeg'); 
 écho '';

0
pabacu
byte[] byteArray = rs.getBytes("columnname");  

Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0 ,byteArray.length);
0
bhruguni

vous voudrez peut-être aussi encoder et décoder vers/depuis base64

    function uncompress(str:String):ByteArray {
            import mx.utils.Base64Decoder;
            var dec:Base64Decoder = new Base64Decoder();
            dec.decode(str);
            var newByteArr:ByteArray=dec.toByteArray();        
            return newByteArr;
        }


    // Compress a ByteArray into a Base64 String.
    function compress(bytes:ByteArray):String { 
        import mx.utils.Base64Decoder; //Transform String in a ByteArray.
        import mx.utils.Base64Encoder; //Transform ByteArray in a readable string.
        var enc:Base64Encoder = new Base64Encoder();    
        enc.encodeBytes(bytes);
        return enc.drain().split("\n").join("");
    }
0
johnny