75 votes

comment stocker une image en tant que blob dans Sqlite et comment la 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 le 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, j'ai ici null .

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

0 votes

En récupérant la base de données, je n'obtiens pas exactement byte[]...... Une aide ?

69voto

blessenm Points 14700

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

Ce code va prendre une image depuis l'url et la convertir en un 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 sauvegarder l'image dans la base de données, 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, voici 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));

0 votes

InsertStmt.bindBlob(3, this.accImage) ; est utilisé pour insérer l'image où accImage est un tableau d'octets renvoyé par la méthode getLogoImage dans le premier bloc de code.

1 votes

J'ai obtenu null au niveau du bitmap. J'ai obtenu la valeur de byte[]

0 votes

Pouvez-vous définir le tableau d'octets en vue d'une image juste après avoir converti l'url en tableau d'octets ? Si vous êtes en mesure de visualiser l'image alors. Alors nous pouvons savoir que quelque chose ne va pas dans les opérations de la base de données. Sinon, c'est une erreur dans la façon dont vous accédez à l'image depuis le serveur.

24voto

Balaji.K Points 4614

Dans le DBAdaper, c'est-à-dire la classe d'aide de la base de données, 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,

convertissez d'abord les images en byte[]

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

0 votes

Vérifiez d'abord si vous avez récupéré l'octet[] du curseur ou non, en utilisant la variable imageByteArray.length.

0 votes

Vérifier la longueur de byte[], c'est-à-dire photo.lenght. Si la valeur est supérieure à zéro, alors vous obtiendrez sûrement le bon bitmap. Si la longueur est de zéro, alors vérifiez votre requête.

0 votes

"System.out.println(">>>>>>>>>>> "+imageByteArray.length) ;" ce qu'il imprime

1voto

Nishant Shah Points 1103

Dans insert()

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

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

J'espère que cela vous aidera.

1voto

Pratik Butani Points 4290

Vous pouvez vérifier Ici pour insérer l'image dans la base de données :

c'est utile pour moi :

-1voto

Jaan Points 353

Vous pouvez également vouloir coder 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 votes

Il n'y a aucune raison de passer par base64 lorsque vous pouvez stocker un tableau d'octets car cela ne ferait qu'augmenter le stockage nécessaire (et perdre du temps inutilement à encoder). L'encodage en base64 est difficilement lisible.

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