我正在尝试使用带有插入,更新和删除的句柄数据库,例如记事本。我在取消数据方面遇到了问题。在正常情况下,按下确认按钮,它将被保存到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`
答案 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