在Sqlite中取消

时间:2013-06-24 20:25:56

标签: android android-sqlite notepad

我正在尝试使用带有插入,更新和删除的句柄数据库,例如记事本。我在取消数据方面遇到了问题。在正常情况下,按下确认按钮,它将被保存到sqlite中,并将显示在listview上。如何通过后退键或更多按钮事件进行取消事件? 我希望我的按钮和后退键取消数据,但它继续保存......

        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`

1 个答案:

答案 0 :(得分:1)

以下是在SQLite中使用事务的简短示例(db是以下的SQLiteDatabase实例):

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

注意,重要的是你选择用抛出和异常替换“//你的sql东西”的任何方法。使用insertOrThrow()或者如果您需要更灵活的SQLiteStatement实例(它们的.execute方法总是会在出错时抛出异常)。

注意,您不需要显式回滚。如果您在没有db.endTransaction()的情况下致电.setTransactionSuccessful(),它将自动回滚。

请记住,在最后一次抛出SQLException方法后,总是要设置setTransactionSuccessful:)

您可以使用另一个catch块轻松扩展它,以捕获网络超时的异常。

现在你可以做的是取消或后退按钮在这个例子中可以像一个例外,并自动调用endTransaction,这将导致数据的rollBack