0

メモ帳などの挿入、更新、削除でハンドルデータベースを使用しようとしています。データのキャンセルに問題があります。通常、確認ボタンを押すと、sqlite に保存され、リストビューに表示されます。戻るキーまたはその他のボタン イベントを使用してキャンセル イベントを作成するにはどうすればよいですか? ボタンと戻るキーでデータをキャンセルしたいのですが、保存し続けます...

        public static int numTitle = 1;
public static String curDate = "";
private EditText mTitleText;
private EditText mBodyText;
private Long mRowId;
private NotesDbAdapter mDbHelper;
private TextView mDateText;
private boolean isOnBackeyPressed;
public SQLiteDatabase db;

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

    setContentView(R.layout.note_edit);
    setTitle(R.string.edit_note);

    mTitleText = (EditText) findViewById(R.id.etTitle_NE);
    mBodyText = (EditText) findViewById(R.id.etBody_NE);
    mDateText = (TextView) findViewById(R.id.tvDate_NE);

    long msTime = System.currentTimeMillis();
    Date curDateTime = new Date(msTime);

    SimpleDateFormat formatter = new SimpleDateFormat("d'/'M'/'y");
    curDate = formatter.format(curDateTime);

    mDateText.setText("" + curDate);

    Button confirmButton = (Button) findViewById(R.id.bSave_NE);
    Button cancelButton = (Button) findViewById(R.id.bCancel_NE);
    Button deleteButton = (Button) findViewById(R.id.bDelete_NE);

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

    populateFields();

    confirmButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            setResult(RESULT_OK);
            Toast.makeText(NoteEdit.this, "Saved", Toast.LENGTH_SHORT)
                    .show();
            finish();
        }

    });
    deleteButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mDbHelper.deleteNote(mRowId);
            Toast.makeText(NoteEdit.this, "Deleted", Toast.LENGTH_SHORT)
                    .show();
            finish();
        }
    });
    cancelButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            boolean diditwork = true;

            try {
                db.beginTransaction();
                populateFields();
                 db.setTransactionSuccessful();
            } catch (SQLException e) {
                diditwork = false;
            } finally {
                db.endTransaction();
                if (diditwork) {
                    Toast.makeText(NoteEdit.this, "Canceled",
                            Toast.LENGTH_SHORT).show();
                }
            }
        }
    });
}

private void populateFields() {
    if (mRowId != null) {
        Cursor note = mDbHelper.fetchNote(mRowId);
        startManagingCursor(note);
        mTitleText.setText(note.getString(note
                .getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
        mBodyText.setText(note.getString(note
                .getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
    }
}

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

public void onBackPressed() {
    super.onBackPressed();
    isOnBackeyPressed = true;
    finish();
}

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

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

private void saveState() {
    String title = mTitleText.getText().toString();
    String body = mBodyText.getText().toString();

    if (mRowId == null) {
        long id = mDbHelper.createNote(title, body, curDate);
        if (id > 0) {
            mRowId = id;
        }
    } else {
        mDbHelper.updateNote(mRowId, title, body, curDate);
    }
}`enter code here`
4

1 に答える 1

1

SQLite でトランザクションを使用する簡単な例を次に示します (以下の db は SQLiteDatabase インスタンスです)。

try {
    db.beginTransaction();
    // your sql stuff
    db.setTransactionSuccessful();
} catch(SQLException e) {
    // do some error handling
} finally {
   db.endTransaction();
}

「//your sql stuff」をスローと例外に置き換えるために選択した方法が重要であることに注意してください。()を使用するinsertOrThrowか、より柔軟性が必要な場合は SQLiteStatement インスタンスを使用します (それらの .execute メソッドは常にエラー時に例外をスローします)。

明示的にロールバックする必要はないことに注意してください。db.endTransaction()せずに呼び出すと.setTransactionSuccessful()、自動的にロールバックします。

最後の SQLException メソッドをスローした後に常に setTransactionSuccessful を配置することを忘れないでください:)

これを別の catch ブロックで簡単に拡張して、ネットワーク タイムアウトの例外をキャッチできます。

この例では、キャンセルまたは戻るボタンが例外のように機能し、自動的に endTransaction が呼び出され、データのロールバックが行われます。

于 2013-06-24T20:45:55.220 に答える