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
Ajouter/Modifier l'écran
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é?
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. –
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
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. –