상세 컨텐츠

본문 제목

[안드로이드] ToDoList SQLite 만드는 방법 part2 - 조회, 등록

안드로이드

by aries574 2022. 3. 21. 20:05

본문


이번 시간에는 저번 포스팅에 이어서 하겠습니다.

저번에 만든 DB와 화면에 조회와 등록하는 기능을

추가해 보겠습니다.

2022.03.20 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part1 - 화면과 DB

 

[안드로이드] ToDoList SQLite 만드는 방법 part1 - 화면과 DB

이번 시간에는 ToDoList SQLite 할 일 목록 화면과 DB부분을 만들어 보겠습니다. 목차 1. 실행 화면 2. 라이브러리 등록 3. ToDo 클래스 만들기 4. ToDo DB 만들기 5. ToDo 화면 만들기 6. 메인 화면 구성 acti..

aries574.tistory.com


목차

1. 실행 화면

2. ToDoDB 클래스 수정

3. 어뎁터 클래스 만들기

4. 메인 코드 구현 MainActivity.java


1. 실행 화면

 

2. ToDoDB 클래스 수정

 - 설명 - 

 조회 쿼리의 db변수에는 getReadableDatabase로 변경

    //할일 전체 가져오기
    public ArrayList<ToDoModel> getAllTasks(){

        ArrayList<ToDoModel> taskList = new ArrayList<>();

        Cursor cursor  = null;

        String query = "SELECT * FROM " + TABLE_NAME;

        db = this.getReadableDatabase();

        if(db != null){

            cursor = db.rawQuery(query, null);

            while(cursor.moveToNext()){

                ToDoModel task = new ToDoModel();

                task.setId(cursor.getInt(0));
                task.setTask(cursor.getString(1));
                task.setStatus(cursor.getInt(2));
                taskList.add(task);
            }
        }

        return taskList;
    }

 

3. 어뎁터 클래스 만들기

 - 설명 - 

 toBoolean: 체크상태를 boolean값으로 돌려준다.

 setTasks: 리스트에 데이터 담기

 removeItem: 할일 삭제

 getItemCount: 할일 갯수 돌려준다.

public class ToDoAdapter extends RecyclerView.Adapter<ToDoAdapter.ViewHolder>{

    private ArrayList<ToDoModel> todoList = new ArrayList<>();

    private ToDoDB db;

    public ToDoAdapter(ToDoDB db) {

        this.db = db;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(parent.getContext());

        View view = inflater.inflate(R.layout.task_list, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        ToDoModel item = todoList.get(position);

        holder.mCheckBox.setText(item.getTask());
        holder.mCheckBox.setChecked(toBoolean(item.getStatus()));

        //체크박스 체크 이벤트
        holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

                //체크상태면 1 아니면 0
                if(isChecked){
                    db.updateStatus(item.getId(), 1);
                }else{
                    db.updateStatus(item.getId(), 0);
                }
            }
        });
    }

    /**
     * 체크상태 boolean으로 변경
     * @param n 상태값
     * @return
     */
    private boolean toBoolean(int n){

        return n != 0;
    }

    /**
     * 리스트에 데이터 담기
     * @param todoList 할일 리스트
     */
    public void setTasks(ArrayList<ToDoModel> todoList){

        this.todoList = todoList;
        notifyDataSetChanged();
    }

    /**
     * 할일 삭제
     * @param position 할일 위치
     */
    public void removeItem(int position){
        todoList.remove(position);
        notifyItemRemoved(position);
    }

    /**
     * 할일 갯수
     * @return 갯수
     */
    @Override
    public int getItemCount() {
        return todoList.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder{

        CheckBox mCheckBox;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            mCheckBox = itemView.findViewById(R.id.m_check_box);
        }
    }
}

 

 

4. 메인 코드 구현 MainActivity.java

 - 설명 - 

 1. FloatingActionButton을 누르면 입력 모드가 됩니다. 

 2. 할 일을 적고 (ADD, UPDATE) 버튼을 누르면 FAB모드가 됩니다. 

 3. viewMode:  입력일때와 FAB일 때의 화면 전환 기능 

 4. hideKeyboard: 저장을 하고나면 자동으로 키보드가 사라집니다. 

 5. selectReset: 저장(추가,수정)후에 버튼명 변경 및 조회 기능

 6. selectData: 조회 기능

public class MainActivity extends AppCompatActivity {


    //선언
    ArrayList<ToDoModel> taskList;
    ToDoAdapter adapter;
    RecyclerView recyclerView;
    FloatingActionButton fab;
    EditText todoText;
    Button addBtn;

    //DB
    ToDoDB db;

    //입력 레이아웃
    LinearLayout bottomLayout;

    //할일 ID
    int gId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //DB 연결
        db = new ToDoDB(this);

        ///초기화
        taskList = new ArrayList<>();
        bottomLayout = findViewById(R.id.bottom_section);
        todoText = findViewById(R.id.todo_text);
        addBtn = findViewById(R.id.add_btn);
        fab = findViewById(R.id.fab);

        //recyclerView 설정
        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        //adapter 설정
        adapter = new ToDoAdapter(db);
        adapter.setTasks(taskList);

        //adapter 적용
        recyclerView.setAdapter(adapter);

        //조회
        selectData();

        //등록모드
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                viewMode("ADD");
            }
        });

        //추가 버튼
        addBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                viewMode("FAB");

                String text = todoText.getText().toString();

                //ADD면 등록 아니면 수정
                if(addBtn.getText().toString().equals("ADD")){

                    //데이터 담기
                    ToDoModel task = new ToDoModel();
                    task.setTask(text);
                    task.setStatus(0);

                    //할일 추가
                    db.addTask(task);

                    //조회 및 리셋
                    selectReset("ADD");

                }else{ //수정

                    //할일 수정
                    db.updateTask(gId, text);

                    //조회 및 리셋
                    selectReset("UPDATE");
                }

                //키보드 내리기
                hideKeyboard(todoText);
            }
        });

        //할일 입력 체크
        todoText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if(charSequence.toString().equals("")){
                    addBtn.setEnabled(false);
                    addBtn.setTextColor(Color.GRAY);
                }else{
                    addBtn.setEnabled(true);
                    addBtn.setTextColor(Color.BLACK);
                }
            }

            @Override
            public void afterTextChanged(Editable editable) { }
        });

    }//onCreate

    /**
     * 조회
     */
    public void selectData() {

        taskList = db.getAllTasks();
        Collections.reverse(taskList);
        adapter.setTasks(taskList);
        adapter.notifyDataSetChanged();
    }

    /**
     * 조회및 리셋
     * @param type
     */
    public void selectReset(String type){

        //조회
        selectData();

        //초기화
        todoText.setText("");

        //등록이 아니면 등록으로 변경
        if(!type.equals("ADD")){
            addBtn.setText("ADD");
        }
    }

    /**
     * 화면상태
     * @param type 상태타입
     */
    public void viewMode(String type){

        //입력하고 나면 입력창 사라지고 FAB 보여줌
        if(type.equals("FAB")){
            //입력창 숨김
            bottomLayout.setVisibility(View.GONE);

            //fab 보여줌
            fab.setVisibility(View.VISIBLE);

        }else{//FAB누르면 입력창 보여주고 FAB 사라짐

            //입력창 보여줌
            bottomLayout.setVisibility(View.VISIBLE);

            //fab 숨김
            fab.setVisibility(View.INVISIBLE);
        }
    }

    /**
     * 키보드 숨기는 이벤트
     * @param editText 입력뷰
     */
    private void hideKeyboard(EditText editText) {

        InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

        //키보드 숨김
        manager.hideSoftInputFromWindow(editText.getApplicationWindowToken(), 0);
    }

}//MainActivity

2022.03.16 - [안드로이드] - [안드로이드] Firebase Storage 이미지 업로드 part1

 

[안드로이드] Firebase Storage 이미지 업로드 part1

이번 시간에는 Firebase를 통해서 이미지를 업로드하는 방법을 알아보겠습니다. 간단하게 설명하자면 Firebase의 Storage에 이미지를 업로드하고, 이미지가 저장된 주소를 Realtime Database에 저장합니다.

aries574.tistory.com

2022.03.17 - [안드로이드] - [안드로이드] Firebase Storage 이미지 리스트 part2

 

[안드로이드] Firebase Storage 이미지 리스트 part2

이번 시간에는 Firebase를 통해서 업로드한 이미지를 가져와서 리스트로 보여주는 방법을 알아보겠습니다. 이전에 했던 포스팅을 이어서 하니 먼저 보시면 됩니다. 2022.03.16 - [안드로이드] - [안드

aries574.tistory.com

2022.03.18 - [안드로이드] - [안드로이드] 이미지 원형으로 쉽게 표현하는 방법

 

[안드로이드] 이미지 원형으로 쉽게 표현하는 방법

이번 시간에는 이미지를 원형으로 보여줘야 하는 프로필 화면에서 쓸 수 있는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 라이브러리 등록 3. 메인 화면 구성 activity_main.xml 4. 메인 코드 구현 Mai

aries574.tistory.com

반응형

관련글 더보기

댓글 영역