2017-01-25 14 views
2

私はどこで間違ったコードや論理的欠陥を見つけようとしていますか?2つの文字列とイメージを取り込むレシピアプリケーションを作成し、すべてのデータをデータベースに保存しました。メイン画面データベースからレシピのリストを取得します。AndroidイメージのビットマップをSQLiteのBlobに更新する

Add/Edit Screen

作成または予想される新しいデータが動作している追加

メイン画面

Main Screen

追加/編集画面は、すべてのデータが保存されます。問題は、一度保存した画像を除いてすべて更新できます。二回目の試行では画像に影響を与えていないようですが、画像は変わりません。

コア原則は

(ユーザーがちょうど包みonPauseとonSaveInstanceStateを離れると、更新が行われた)(ユーザーが活動を開始するとのonCreateや活動onResumeを再開)ビューにデータを設定し、ビューからデータを取得することです

コード

@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); 
     } 
    } 
} 

DAO

@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; 
} 

文字列データを更新することはできますが、保存した画像は実際には更新できません。

答えて

2

多くの研究とテストの後、問題は単純に画像ボタンをリセットできなかったことです。

image.setBackground(bitmapDrawable); 

上記のこの方法は、更新のために動作しないようです、私のクイックフィックスは、それがあるように、コードを残し、単にその実際に更新するかどうかを決定するための検出onActivityResultを追加するにバイトのデータを追加するだけでしたデータベースを直接更新するのではなく、画像を更新するのではなく、recreate()のアクティビティ、高価な手順が必要ですが、単純なアプリケーションではコストがかかりません。

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

すべて期待どおりに動作します。

0

私の推測では、問題はあなたのDAOコードにあります。私は同様のセットアップ(テキストとBLOBカラムを持つsqliteテーブルの両方が更新されます)ので、あなたがしようとしていることが可能であることを知っています。

+0

問題はDAOコードではなく、私は更新部分を含むように質問を編集しました。見ただけで、コードはそのロジックだけで動作するようにはなりません。そのシンプルなアプリケーションは、すべてのデータがモジュールからビューに、ビューからモジュールに渡ってくるので、作成はすべていいですが、それを更新しません。私が言及したことを除いて、おそらく書き直しや他の論理が有用で受け入れられるかもしれません。 –

+0

バンドルから新しいビットマップを取得する方法を変更してみてください。 Intent.getParcelableExtra(http://stackoverflow.com/a/12908133/678123)を使用するか、バイト配列として渡すことができます(http://stackoverflow.com/a/11010565/678123)。 – Greg

+0

いいえ、上記のコードを見ると、前のアクティビティで選択が行われた後にIDに関心があるだけです。ビュー/編集モード、選択/ IDがnullでない場合、唯一の新しい/作成モードエクストラを通過しています。getLong(RecipeDAOImp.KEY_ID)各アクティビティはそれ自身のジョブを処理します。すべてのデータは、モジュールからビュー、およびビューからモジュールに送られますが、イメージはDBに保存された後は変更されません。カメラから画像を取得して画像ボタンに設定することはできますが、一度保存しておけば、カメラから画像を取り込んでイメージボタンを更新することはありません。画像は既にDBから取得しています。あなたのご意見に感謝します。 –

関連する問題