0

ユーザーが製品のリストを維持できるようにする Android アプリケーションを作成しています。EnterProductData アクティビティでは、ユーザーは製品に関する情報をフォーム フィールドに入力できます。これにより、その情報が SQLite DB に保存されます。EnterProductData アクティビティでは、UPC コードを取得するためにバーコード スキャナー アプリを介してバーコード スキャンを開始することもできます。

私が直面している問題は、バーコード スキャン アクティビティが完了して値を返すと、onActivityResult() で UPC テキスト フィールドの値を設定しようとすることです。私の onResume() メソッドが、テキスト フィールドの値を現在 DB に保存されているものに設定する関数 (populateFields()) を呼び出しているということです。そして、これはonActivityResult() が呼び出された後に起こっているようです。これは、スキャンされた UPC がテキスト フィールドの値として設定され、その直後に空の値が設定されることを意味します。原因となるコード行は、その横にアスタリスクでコメントされています。

スキャンした UPC を onActivityResult() メソッドですぐに DB に保存すれば、この問題を回避できると思いますが、私の意見では、それはベスト プラクティスではないようです。誰かが私が何をすべきかについて私にアドバイスできますか?

EnterProductData.java

public class EnterProductData extends Activity {

    private Button mScanButton;
    private EditText mUPC;
    private Button mSaveButton;
    private Long mRowId;
    private DbAdapter mDbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDbHelper = new DbAdapter(this);
        mDbHelper.open();

        setContentView(R.layout.enter_product_data);

        mUPC = (EditText) findViewById(R.id.UPC);
        mScanButton = (Button) findViewById(R.id.scanButton);
        mSaveButton = (Button) findViewById(R.id.saveButton);

        mRowId = (savedInstanceState == null) ? null :
        (Long) savedInstanceState.getSerializable(DbAdapter.KEY_PRODUCT_ROWID);
        if (mRowId == null) {
            Bundle extras = getIntent().getExtras();
            mRowId = extras != null ? extras.getLong(DbAdapter.KEY_PRODUCT_ROWID): null;
        }

        populateFields();

        mScanButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                IntentIntegrator.initiateScan(EnterProductData.this);
            }
        });

        mSaveButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                setResult(RESULT_OK);
                finish();
            }
        });

    }

    private void populateFields() {
        if (mRowId != null) {
            Cursor product = mDbHelper.fetchProduct(mRowId);
            startManagingCursor(product);
            mUPC.setText(product.getString(
                product.getColumnIndexOrThrow(DbAdapter.KEY_UPC))); //******
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        saveState();
        outState.putSerializable(DbAdapter.KEY_PRODUCT_ROWID, mRowId);
    }

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

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

    private void saveState() {
     String upc= mUPC.getText().toString();
        if (mRowId == null) {
            long id = mDbHelper.createProduct(mRowId, UPC);
            if (id > 0) {
                mRowId = id;
            }
        } else {
            mDbHelper.updateProduct(mRowId, UPC);
        }
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  switch(requestCode) {
   case IntentIntegrator.REQUEST_CODE: {
    if (resultCode != RESULT_CANCELED) {
     IntentResult scanResult =
     IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
     if (scanResult != null) {
      String upc = scanResult.getContents();
      mUPC.setText(upc);
     }
    }
    break;
   }
  }
 }
}
4

1 に答える 1

1

起動時、つまり onCreate でデータベースから値を読み取り、メンバー変数に格納できます。必要に応じてこれらの値を更新します。アプリケーションの終了時に値をデータベースに保存します。これにより、問題が修正されるだけでなく、多くのデータベースのやり取りが防止されます。

于 2010-11-17T03:07:33.523 に答える