데이터베이스를 만든 것으로 몇가지 기능을 추가하였다.
문제 확인 화면에서 문제를 수정할 수 있는 기능을 추가하였다.
수정하기 버튼을 누르면 문제 수정 화면으로 넘어가고, 수정 내용을 입력한 수 버튼을 누르면 수정된 정보가 반영되도록 하였다.
먼저 문제를 보여주는 ListQActivity에서 수정하기 버튼을 누르면 문제 수정 화면인 EditActivity로 넘어가도록 만들었다.
buttonEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Question item = new Question(num, title.getText().toString(), question.getText().toString(), answer.getText().toString());
Intent intent = new Intent(getApplicationContext(),EditActivity.class);
intent.putExtra("data", item);
startActivityForResult(intent, REQUEST_CODE_EDIT);
}
});
이 때 Question 객체로 원래 문제 내용을 intent로 전달하도록 하였다.
EditActivity는 실행되면 먼저 intent를 받아 그 안의 데이터로 입력 상자에 기존 문제 내용을 넣도록 하였다.
Intent intent = getIntent();
if(intent != null){
Bundle bundle = intent.getExtras();
Question data = bundle.getParcelable("data");
num = data.getNum();
editTextTitle.setText(data.getTitle());
editTextQuestion.setText(data.getQuestion());
editTextAnswer.setText(data.getAnswer());
}
}
내용을 수정한 후 문제 수정하기 버튼을 누르면 데이터베이스에 수정 내용을 반영하고, 문제를 보여주는 ListQActivity 화면으로 수정된 내용을 Question 객체로 만들어 보내도록 만들었다.
Button button = findViewById(R.id.buttonEditQuestion);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editQuestion();
Question item = new Question(num, editTextTitle.getText().toString(), editTextQuestion.getText().toString(), editTextAnswer.getText().toString());
Intent intent = new Intent();
intent.putExtra("dataFromEdit",item);
setResult(RESULT_OK, intent);
finish();
}
});
...
private void editQuestion(){
String title = editTextTitle.getText().toString();
String question = editTextQuestion.getText().toString();
String answer = editTextAnswer.getText().toString();
String sql = "UPDATE " + QuestionDatabase.TABLE_QUESTION + " SET " +
"TITLE = '" + title + "', " +
"QUESTION = '" + question + "', " +
"ANSWER = '" + answer + "' " +
"WHERE _id = " + num;
QuestionDatabase database = QuestionDatabase.getInstance(this);
database.execSQL(sql);
}
}
ListQActivity로 다시 돌아오면서 onActivityResult 메소드를 오버라이드 하여 수정된 내용을 받아 보여주도록 하였다.
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE_EDIT){
if(resultCode == RESULT_OK){
Question dataFromEdit = data.getParcelableExtra("dataFromEdit");
num = dataFromEdit.getNum();
title.setText(dataFromEdit.getTitle());
question.setText(dataFromEdit.getQuestion());
answer.setText(dataFromEdit.getAnswer());
Toast.makeText(getApplicationContext(),"문제가 수정되었습니다.", Toast.LENGTH_SHORT).show();
}
}
}
문제 확인 화면에서 문제를 삭제할 수 있는 기능을 추가하였다.
삭제하기 버튼을 누르면 재확인을 위해 대화상자를 띄우도록 하였다.
buttonDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDeleteMessage();
}
});
...
private void showDeleteMessage(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("문제 삭제");
builder.setMessage("정말로 삭제하시겠습니까?");
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setPositiveButton("예", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 삭제 버튼이 눌렸을 때 이벤트
deleteQuestion();
finish();
}
});
builder.setNegativeButton("아니오", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 아니오 버튼이 눌렸을 때 이벤트
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
아니오 버튼이 눌렸을 땐 아무런 일도 일어나지 않도록 했고, 예 버튼을 누르면 정의한 deleteQuestion 메소드를 호출해 데이터베이스에서 문제를 삭제하고, finish() 메소드로 액티비티를 종료하도록 만들었다.
private void deleteQuestion(){
QuestionDatabase database = QuestionDatabase.getInstance(this);
String sql = "DELETE FROM " + QuestionDatabase.TABLE_QUESTION + " WHERE _id = " + num;
database.execSQL(sql);
/*
sql = "ALTER TABLE " + QuestionDatabase.TABLE_QUESTION + " AUTO_INCREMENT = " + num;
database.execSQL(sql);
*/
}
마지막으로 문제가 수정되거나 삭제된 후 문제들을 보여주는 ListActivity로 돌아왔을 때 수정된 내용이 반영될 수 있도록 onResume() 메소드에 onCreate() 안의 내용을 그대로 넣어주었다.
// 문제 삭제 후, ListActivity로 돌아왔을 때 삭제된 것이 반영되도록 하기 위해서
@Override
protected void onResume() {
super.onResume();
recyclerView = findViewById(R.id.RecyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
adapter = new QuestionAdapter();
// 리사이클러뷰에 문제 추가
loadQuestionListData();
adapter.setOnItemClickListener(new OnQuestionClickListener() {
@Override
public void onItemClick(QuestionAdapter.ViewHolder holder, View view, int position) {
Question item = adapter.getItem(position);
Intent intent = new Intent(getApplicationContext(), ListQActivity.class);
intent.putExtra("data", item);
startActivity(intent);
}
});
recyclerView.setAdapter(adapter);
}
기능으로선 제대로 작동하지만, 한가지 수정하고싶은 문제가 있다.
데이터베이스의 _id의 설정을 AUTO_INCREMENT로 설정해 둔 탓에 문제를 삭제하고 다시 만들 경우 _id 값이 늘어난 상태로 유지되버린다. 이를 해결하고싶어 문제 삭제 메소드에 AUTO_INCREMENT값을 재설정하는 SQL문을 넣어봤지만 작동하지 않았다.