[프로젝트] 자문자답 앱 - 기능 구현(2)

유의선·2023년 11월 5일
0

데이터베이스를 만든 것으로 몇가지 기능을 추가하였다.


문제 수정 기능

문제 확인 화면에서 문제를 수정할 수 있는 기능을 추가하였다.

수정하기 버튼을 누르면 문제 수정 화면으로 넘어가고, 수정 내용을 입력한 수 버튼을 누르면 수정된 정보가 반영되도록 하였다.


먼저 문제를 보여주는 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문을 넣어봤지만 작동하지 않았다.

0개의 댓글