2017-01-25 2 views
2

J'essaie de comprendre où je me suis trompé de codage ou de faille logique, j'ai créé une application de recette qui prend quelques chaînes et une image, toutes les données sont enregistrées dans la base de données et sur le écran principal Je reçois une liste de recettes de la base de données.Mettre à jour Android Image Bitmap à SQLite Blob

écran principal

Main Screen

Ajouter/Modifier l'écran

Add/Edit Screen

Création ou ajout de nouvelles données fonctionne comme prévu, toutes les données sont sauvés. Le problème est que tout peut être mis à jour à l'exception de l'image une fois qu'il a été enregistré une seconde tentative ne semble pas affecter l'image, l'image reste la même.

Le principe de base est de définir des données sur les vues (Lorsque l'utilisateur démarre l'activité onCreate ou reprendre l'activité onResume) et obtenir des données des vues (Lorsque utilisateur quitte OnPause et onSaveInstanceState emballent juste une mise à jour a été faite)

code

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_add_edit); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       enableEdit(); 
       fab.hide(); 
      } 
     }); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     recipeDAOImp = new RecipeDAOImp(this); 
     recipeDAOImp.open(); 
     findViews(); 

     rowId = (savedInstanceState == null) ? null : 
       (Long) savedInstanceState.getSerializable(RecipeDAOImp.KEY_ID); 
     if (rowId == null) { 
      Bundle extras = getIntent().getExtras(); 
      rowId = extras != null ? extras.getLong(RecipeDAOImp.KEY_ID) 
        : null; 
     } 
     populateData(); 
     disableEdit(); 
    } 

    private void findViews() { 
     // Finds Views and Set onClick to imageButton 
    } 


    private void disableEdit() { 
     // Disable Views 
    } 

    private void enableEdit() { 
     // Enables Views 
    } 

    private void populateData() { 
     // If rowId is available then user is trying to Edit Recipe 
     if (rowId != null) { 
      setTitle("Edit Recipe"); 
      Recipe recipe = new Recipe(rowId); 
      Cursor cursor = recipeDAOImp.getRecipe(recipe); 
      startManagingCursor(cursor); 
      title.setText(cursor.getString(
        cursor.getColumnIndexOrThrow(RecipeDAOImp.KEY_TITLE))); 
      ingredients.setText(cursor.getString(
        cursor.getColumnIndexOrThrow(RecipeDAOImp.KEY_INGREDIENTS))); 

      steps.setText(cursor.getString(
        cursor.getColumnIndexOrThrow(RecipeDAOImp.KEY_STEPS))); 

      category.setText(cursor.getString(
        cursor.getColumnIndexOrThrow(RecipeDAOImp.KEY_CATEGORY))); 

      BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), DbBitmapUtility.getImage(cursor.getBlob(
        cursor.getColumnIndexOrThrow(RecipeDAOImp.KEY_IMAGE)))); 
      image.setBackground(bitmapDrawable); 
     // Else user is Adding a new Recipe 
     } else { 
      fab.hide(); 
      setTitle("Add Recipe"); 
      enableEdit(); 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     saveState(); 
     outState.putSerializable(RecipeDAOImp.KEY_ID, rowId); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     saveState(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     populateData(); 
    } 

    private void saveState() { 
     // Get the values from the views 
     String titleString = title.getText().toString(); 
     String ingredientString = ingredients.getText().toString(); 
     String stepsString = steps.getText().toString(); 
     String categoryString = category.getText().toString(); 
     // Get the image from imageButton 
     Drawable drawable = image.getBackground(); 
     Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); 
     byte[] imageData = DbBitmapUtility.getBytes(bitmap); 
     // Just to clarify image is never null as the backround is a camre image 
     if (titleString.equals(null) || "".equals(titleString) || ingredientString.equals(null) || "".equals(ingredientString) || stepsString.equals(null) || "".equals(stepsString) || categoryString.equals(null) || "".equals(categoryString) || imageData.equals(null) || "".equals(imageData)) { 
      Toast.makeText(this, "No Data Saved", Toast.LENGTH_SHORT).show(); 
     } else { 
      Recipe recipe = new Recipe(titleString, ingredientString, stepsString, categoryString, imageData); 
      // If rowId is not Available then user is Creating a new Recipe 
      if (rowId == null) { 
       long id = recipeDAOImp.createRecipe(recipe); 
       if (id > 0) { 
        rowId = id; 
       } 
      } else { 
       recipe.setId(rowId); 
       recipeDAOImp.updateRecipe(recipe); 
      } 
     } 
    } 

    @Override 
    public void onClick(View view) { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
      Bundle extras = data.getExtras(); 
      Bitmap imageBitmap = (Bitmap) extras.get("data"); 
      // Set the imageButton 
      BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), imageBitmap); 
      image.setBackground(bitmapDrawable); 
     } 
    } 
} 

OAC

@Override 
public boolean updateRecipe(Recipe recipe) { 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(KEY_TITLE, recipe.getTitle()); 
    contentValues.put(KEY_INGREDIENTS, recipe.getIngredients()); 
    contentValues.put(KEY_STEPS, recipe.getSteps()); 
    contentValues.put(KEY_CATEGORY, recipe.getCategory()); 
    contentValues.put(KEY_IMAGE, recipe.getImage()); 
    return sqLiteDatabase.update(DATABASE_TABLE, contentValues, KEY_ID + "=" + recipe.getId(), null) > 0; 
} 

Quel pourrait être le problème que je peux mettre à jour les données de chaîne mais je ne peux pas vraiment mettre à jour l'image une fois qu'il a été enregistré?

Répondre

2

Après de nombreuses recherches et tests, le problème était simplement que le bouton d'image ne pouvait pas être réinitialisé.

image.setBackground(bitmapDrawable); 

Cette méthode ci-dessus semble ne pas travailler pour une mise à jour, ma solution rapide était simplement de laisser le code tel qu'il est et il suffit d'ajouter une détection onActivityResult pour déterminer si sa mise à jour puis en fait, ajoutez les octets de données à base de données directement, plutôt que de mettre à jour le bouton image, puis recreate() l'activité, procédure coûteuse mais pas coûteuse pour une application simple.

if (rowId != null) { 
       ... 
       recipe.setImage(DbBitmapUtility.getBytes(imageBitmap)); 
       recipeDAOImp.updateRecipe(recipe); 
       recreate(); 
      } 

Tout Fonctionnement normal.

0

Je suppose que le problème est dans votre code DAO. J'ai une configuration similaire (table sqlite avec colonnes de texte et de blob, les deux sont mises à jour), donc je sais que ce que vous essayez de faire est possible.

+0

Le problème n'est pas dans le code DAO, j'ai édité la question pour inclure la partie de mise à jour, jetez un oeil, la chose est le code fonctionne juste la logique que je ne peux pas l'obtenir pour le moment. C'est une application simple donc toutes les données viennent du module aux vues, et des vues au module, la création est tout bon mais mise à jour son non, l'image ne change tout simplement pas une fois son ensemble. peut-être une réécriture ou une autre logique en dehors de ce que j'ai mentionné pourrait être utile et acceptable. –

+0

Essayez de changer la façon dont vous obtenez le nouveau bitmap de votre Bundle. Vous pouvez essayer d'utiliser Intent.getParcelableExtra (http://stackoverflow.com/a/12908133/678123) ou vous pouvez le passer en tant que tableau d'octets (http://stackoverflow.com/a/11010565/678123). – Greg

+0

Non, si vous regardez le code ci-dessus je ne m'intéresse à l'ID que si une sélection a été faite dans l'activité précédente, c'est un mode Visualisation/Edition, Si aucune sélection/ID n'est nulle, c'est un nouveau mode Création Je passe des extras.getLong (RecipeDAOImp.KEY_ID) car chaque activité gère son propre travail. Toutes les données proviennent du module aux vues, et des vues au module mais l'image ne change pas une fois réglée, une fois enregistrée dans la DB. Je peux obtenir une image de la caméra et la positionner sur le bouton de l'image, mais une fois sauvegardé en prenant des images de l'appareil photo, je ne mettrai pas à jour le bouton de l'image, l'image provient déjà de DB. J'apprécie votre contribution. –