SQLiteDatabase 를 적용해서 Todo 앱을 만들어보았다

순순·2024년 4월 5일

Android

목록 보기
4/12

1. SQLite


개념

  • 안드로이드에 내장된 관계형 데이터베이스

특징

  • 안드로이드 OS에 내장되어 있음
  • 표준 SQL문을 사용하는 관계형 데이터베이스 (RDBMS)
  • 데이터베이스를 사용하는 애플리케이션에 셋팅되는 데이터베이스.

용어

  • table : 데이터베이스 내에서 데이터를 묶어서 관리하는 요소
  • column : 테이블 내의 데이터 항목 (컬럼, 열)
  • row : 테이블에 저장되어 있는 개체 하나에 대한 컬럼의 묶음 (로우, 행)
구분1열2열3열
1행1행 1열1행 2열1행 3열
2행
3행

생성 방식

  • 쿼리문 사용
    • MySQL과 유사한 문법을 씀 (create, insert, delete, update …)
    • 대소문자는 구분하지 않음
  • 제공되는 클래스를 이용
    • 개발자가 정해줘야하는 몇가지 정보를 제공하면 쿼리문이 생성되고 실행되는 구조

SQLiteOpenHelper 클래스

  • 안드로이드에서 SQLite 데이터 베이스를 사용하려면 SQLiteOpenHelper를 상속받은 클래스를 만들어야 한다.
  • 이 클래스는 사용할 데이터베이스의 이름을 설정하는 것 뿐만아니라 다음 기능들을 제공하고 있다.
    • 지정된 데이터베이스 파일을 사용하려고 할 때 파일이 없으면 파일을 만들고 onCreate 메서드를 호출한다. (이 메서드에서는 테이블을 만드는 쿼리를 실행해주면 된다)
    • 애플리케이션을 서비스하다가 데이터베이스 구조를 변경하려면 데이터베이스의 버전을 변경하면 된다. (버전을 변경하면 onUpgrade 메서드가 호출되고 여기에서 테이블을 새로운 구조로 변경해주는 작업을 하면 된다)

DB 파일의 생성위치

  • SQLiteOpenHelper의 주생성자 중 context로 설정한 위치에 DB가 생성된다. (주로 Activity)
  • 기기(또는 에뮬레이터)에 생성된 SQLite DB를 확인하는 경로
    • Android IDE의 Device Explorer 기능을 이용해 파일을 확인할 수 있다.
    • 파일경로는 보통 “data/data/package이름/databases~”
    • 여기서 확인되는 파일을 SQLite Viewer 사이트에서 열면 DB를 더 편하게 볼 수 있다.
  • 아래는 안드로이드 에뮬레이터에서 확인하는 방법! (캡처화면)


2. ToDo 앱 만들기


(1) SQLite를 상속받는 클래스를 만들어준다. (DBHelper.kt)

  • create를 사용하여 table을 만듦
package kr.co.lion.test3

import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper

class DBHelper(context:Context, dbName:String, version:Int) : SQLiteOpenHelper(context, dbName, null, version){
    companion object{
        val databaseVersion = 1
    }

    override fun onCreate(db: SQLiteDatabase?) {

        val sql = """create table ToDoList
            | (idx integer primary key autoincrement,
            | data1 String not null,
            | data2 String not null,
            | data3 integer not null)
        """.trimMargin()

        // 쿼리문 실행
        db?.execSQL(sql)
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {

    }
}

(2) SQLiteOpenHelper 의 객체를 생성하고 읽어준다. (MainActivity.kt)

        // DBHelper 객체 생성
        val dbHelper = DBHelper(mainActivity, "test.db", DBHelper.databaseVersion)

        // SQLite 읽어오기
        val sqLiteDatabase =  dbHelper.writableDatabase

        // 데이터 베이스를 닫아준다.
        sqLiteDatabase.close()

(3) 생성된 DB의 모습 캡처 (sqliteviewer 사이트)


(4) 여기까지가 SQL table만 만든 상태. 이 DB에 data를 추가하려면?

  • 사용자가 내용을 입력 → “저장” 버튼을 클릭 → DB에 data 추가
  • button 리스너에 insert 쿼리문 사용

    fun setEvent(){
        fragmentInputBinding.apply {
            // 버튼을 누르면 입력한 내용을 DB에 저장
            buttonInput.setOnClickListener {
                // 사용자가 입력한 내용을 가져온다.
                val title = textFieldToDoListTittle.text.toString()
                val content = textFieldToDoListContent.text.toString()
                // 할일 완료 여부
                val isDone = false

                // 입력 검사
                if (title.isEmpty()) {
                    Snackbar.make(fragmentInputBinding.root, "제목을 입력해주세요", Snackbar.LENGTH_SHORT).show()
                }
                if (content.isEmpty()) {
                    Snackbar.make(fragmentInputBinding.root, "내용을 입력해주세요", Snackbar.LENGTH_SHORT).show()
                }

                // DB에 넣어준다
                val sqLiteInsert = """insert into ToDoList
                    | (data1, data2, data3)
                    | values (?, ?, ?)
                """.trimMargin()

                // ?에 맵핑될 값
                // 순서대로 작성해줘야 한다.
                val arg1 = arrayOf(title, content, isDone)

                // DBHelper 객체 생성
                val dbHelper = DBHelper(mainActivity, "test.db", DBHelper.databaseVersion)

                // 쿼리문을 실행한다.
                // 첫 번째 - 쿼리문, 두 번째 - ? 에 바인딩될 값이 담긴 배열
                dbHelper.writableDatabase.execSQL(sqLiteInsert, arg1)

                // SQLite 읽어오기
                val sqLiteDatabase = dbHelper.writableDatabase
                // 데이터 베이스를 닫아준다.
                sqLiteDatabase.close()

                Toast.makeText(mainActivity, "저장완료", Toast.LENGTH_SHORT).show()
            }
        }

    }

그리고 돌려보면

데이터가 추가되어있다.
인덱스 1,2번은 걍 암거나 입력한건데 저장눌러버림 ㅎㅎ

인덱스는 입력하지 않았는데 추가되어있다. autoincrement로 선언해서 자동생성 된 것이다! 아무튼 잘 저장되는 것을 보니 별 거 아닌데 기뻤음


(5) 이제 DB 저장한 항목을 리사이클러뷰에 띄워야 한다.

리사이클러뷰를 갱신하려면?

Adatper 클래스의 notifyDataSetChanged() 메서드를 호출하면 된다.
저장된 목록을 불러와 리스트에 저장하고 화면에 띄워주면 끝!!!!

profile
플러터와 안드로이드를 공부합니다

0개의 댓글