2017-09-18 2 views
0

J'essaie de stocker et de récupérer des données d'image dans Sqlite Db. Pour ce faire, j'ai d'abord stocké dans la mémoire de l'appareil local un exemple de pic (chemin: storage/emulated/0/Download /).Gérer le type de données Blob via ContentValues ​​

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> { 

    private final String SAMPLE_IMAGE_PATH = "/storage/emulated/0/Download/image.jpg"; 

Je mis en place une méthode d'insertion pour alimenter la db avec ces exemples de données:

private void insertProduct() { 
    // Create a ContentValues object where column names are the keys, 
    // and sample attributes are the values. 

    ContentValues values = new ContentValues(); 
    values.put(InventoryContract.ProductEntry.COLUMN_PRODUCT_NAME, sampleName); 
    values.put(InventoryContract.ProductEntry.COLUMN_PRODUCT_QTY, sampleQty); 
    values.put(InventoryContract.ProductEntry.COLUMN_PRODUCT_PRICE, SamplePrice); 
    values.put(InventoryContract.ProductEntry.COLUMN_EMAIL, sampleMail); 
    values.put(InventoryContract.ProductEntry.COLUMN_PHONE, samplePhone); 
    values.put(InventoryContract.ProductEntry.COLUMN_PRODUCT_PIC, SAMPLE_IMAGE_PATH); 

    //insert a new row 
    Uri newUri = getContentResolver().insert(InventoryContract.ProductEntry.CONTENT_URI,values); 
} 

et je définir la méthode onCreateLoader comme suit:

public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    // Define a projection that specifies the columns from the table we care about. 
    String[] projection = { 
      InventoryContract.ProductEntry._ID, 
      InventoryContract.ProductEntry.COLUMN_PRODUCT_PIC, 
      InventoryContract.ProductEntry.COLUMN_PRODUCT_PRICE, 
      InventoryContract.ProductEntry.COLUMN_PRODUCT_QTY, 
      InventoryContract.ProductEntry.COLUMN_PRODUCT_NAME}; 

    // This loader will execute the ContentProvider's query method on a background thread 
    return new CursorLoader(this, 
      InventoryContract.ProductEntry.CONTENT_URI, 
      projection, 
      null,  
      null,     
      null);     
} 

Dans la classe CursorAdapter J'ai mis à jour le listView en ajoutant les données de db dans la méthode bindView():

public void bindView(View view, Context context, Cursor cursor) { 

    // Find individual views that we want to modify in the list item layout 
    TextView nameTextView = (TextView) view.findViewById(R.id.prod_name); 
    TextView priceTextView = (TextView) view.findViewById(R.id.prod_price); 
    TextView qtyTextView = (TextView) view.findViewById(R.id.prod_qty); 
    ImageView prodImageView = (ImageView) view.findViewById(R.id.prod_img); 

    // Find the columns of attributes that we're interested in 
    int nameColumnIndex = cursor.getColumnIndex(InventoryContract.ProductEntry.COLUMN_PRODUCT_NAME); 
    int priceColumnIndex = cursor.getColumnIndex(InventoryContract.ProductEntry.COLUMN_PRODUCT_PRICE); 
    int qtyColumnIndex = cursor.getColumnIndex(InventoryContract.ProductEntry.COLUMN_PRODUCT_QTY); 
    int picColumnIndex = cursor.getColumnIndex(InventoryContract.ProductEntry.COLUMN_PRODUCT_PIC); 

    // Read the attributes from the Cursor for the current product 
    String prodName = cursor.getString(nameColumnIndex); 
    Double prodPrice = cursor.getDouble(priceColumnIndex); 
    int prodQty = cursor.getInt(qtyColumnIndex); 
    byte [] prodImg = cursor.getBlob(picColumnIndex); 

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inTempStorage = new byte[1024 * 32]; 

    Bitmap bmp = BitmapFactory.decodeByteArray(prodImg, 0, prodImg.length, options); 


    //Update Views 
    nameTextView.setText(String.valueOf(prodName)); 
    priceTextView.setText(prodPrice.toString()); 
    qtyTextView.setText(String.valueOf(prodQty)); 
    prodImageView.setImageBitmap(bmp); 
} 
} 

Lorsque j'essaie d'exécuter ce code, tout va bien, mais je vois une image vide à la place de la photo sélectionnée et de la photo de placement.

Donc je pense qu'il y a un problème avec l'insertion de données dans db.

+1

Ceci n'est pas un problème d'Andorid Studio. N'utilisez pas la balise Android Studio – Zoe

Répondre

1

Je suis en train de stocker et récupérer des données d'image dans SQLite Db

Je ne recommande pas. Stockez les images dans des fichiers. Stocker des données dans les lignes qui identifient les fichiers.

Je mis en place une méthode d'insertion pour alimenter la db avec ces données d'exemple

Vous stockez une chaîne dans COLUMN_PRODUCT_PIC. Vous n'enregistrez pas un byte[]. C'est bien, par rapport à ma recommandation. Ceci est incorrect par rapport à votre code de récupération de données, où vous tentez de récupérer un code byte[].

+0

Compris! Suite à votre suggestion, j'ai modifié un code en récupérant une chaîne: String prodPathPic = cursor.getString (picColumnIndex) et en le transformant dans une image avec Drawable.createFromPathMethod, mais j'ai encore quelques problèmes avec permission. Mais ceci est une autre histoire ... Merci – akstavrh

+0

@akstavrh: Cela devrait retourner la valeur de 'SAMPLE_IMAGE_PATH'. Vous pouvez le transmettre à votre bibliothèque de chargement d'images préférée (par exemple, Glide, Picasso). – CommonsWare