2017-10-13 3 views
-1

Je peux enregistrer les images dans la base de données. Le problème que j'ai maintenant est de le récupérer et de l'utiliser dans le code.Comment récupérer une seule image à partir d'une base de données SQLite

Regardez mon gestionnaire de base de données méthode get:

ImageClass getImage(int state_id) { 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(DATABASE_TABLE_NAME, new String[]{STATE_ID, STATE_NAME, STATE_IMAGE}, STATE_ID + "=?", 
      new String[]{String.valueOf(state_id)}, null, null, null, null); 
    if (cursor != null); 
    cursor.moveToFirst(); 

     ImageClass imageClass = new ImageClass(Integer.parseInt(cursor.getString(0)), 
       cursor.getString(1), cursor.getBlob(1)); 

     cursor.close(); 



    return imageClass; 
} 

Regardez le code i utilisé dans l'activité principale ..

btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ImageClass imageClass = db.getImage(); 
      byte[]in = imageClass._image; 
       Bitmap imah = Utils.getImage(in); 


       img.setImageBitmap(imah); 

      } 
     }); 
    } catch(IOException e) { 
     System.out.println(e); 
    } 
} 

Ceci est mon image Activité

public class ImageClass { 
int _id; 
byte[] _image; 
String _state_name; 


public ImageClass(){ 

} 

public ImageClass(int state_id,String state_name, byte[] state_image) { 
    this._id = state_id; 
    this._state_name = state_name; 
    this._image = state_image; 

} 

public ImageClass(String state_name, byte[]state_image){ 
    this._state_name = state_name; 
    this._image = state_image; 
} 
public ImageClass(int state_id, byte[]state_image){ 
    this._id = state_id; 
    this._image= state_image; 
} 

public int get_id() { 
    return this._id; 
} 

public void set_id(int state_id) { 
    this._id = state_id; 
} 

public byte[] get_image() { 
    return this._image; 
} 

public void set_image(byte[] state_image) { 
    this._image = state_image; 
} 

public String get_state_name() { 
    return this._state_name; 
} 

public void set_state_name(String set_state_name) { 
    this._state_name = set_state_name; 
} 

Son vraiment été frustrant moi depuis. essayé beaucoup de choses en ligne, juste ne pourrais pas trouver la bonne façon ...

+4

chemin droit est de stocker chemin de l'image dans la base de données au lieu fichier image –

+2

Convenu. Stocker de gros blobs dans SQLite n'est pas recommandé. – CommonsWare

+1

Appuyant les commentaires ci-dessus. Enregistrez votre image dans le dossier [Stockage interne] (https://developer.android.com/guide/topics/data/data-storage.html#filesInternal) de votre application et enregistrez une référence au chemin du fichier dans votre base de données à la place. –

Répondre

0

Je crois que votre problème est que vous spécifiez un décalage/valeur d'index de 1 lors de la récupération du blob-à-dire que vous avez cursor.getBlob(1), cela récupérera le tableau d'octets de la colonne STATE_NAMEet non la colonne STATE_IMAGE.

Le paramètre pour les méthodes get????() du curseur correspond au décalage/index de la colonne dans le curseur. Comme STATE_IMAGE est la troisième colonne du curseur, il est compensé sera pas 1. En tant que tel, ce qui suit fonctionnerait: -

cursor.getBlob(2)

Cependant, comme vous l'avez trouvé, en utilisant les décalages peuvent entraîner très facilement dans les erreurs. Vous aurez probablement moins d'erreurs et un code plus facilement maintenu si vous utilisez le nom de la colonne via la méthode Curseurs getColumnIndex. En utilisant ceci, ce qui précède serait le suivant: -

cursor.getBlob(csr.getColumnIndex(STATE_IMAGE)).

Je vous suggère de changer: -

ImageClass imageClass = new ImageClass(Integer.parseInt(cursor.getString(0)), 
      cursor.getString(1), cursor.getBlob(1)); 

à: -

ImageClass imageClass = new ImageClass(Integer.parseInt(cursor.getString(cursor.getColumnIndex(STATE_ID)), 
      cursor.getString(cursor.getColumnIndex(STATE_NAME)), cursor.getBlob(cursor.getColumnIndex(STATE_IMAGE)));