Android/JETPACK

[JETPACK개론] SQLite(1)

쏭식 2022. 8. 29. 23:59

앱을 이용하다보면 네트워크가 끊겼을 때 네트워크 오류입니다. 다시 시도해 주세요 라는 메세지를 본 적이 있다.

하지만 카카오톡 채팅방처럼 네트워크가 연결되어 있지 않은 상황에서도 잘 보이고 있는 것을 알 수 있다.

 

서버에서 불러오는 방식일 수도 있지만 다른 곳에다가 저장을 해두고, 불러오는 방식을 사용할 수 있을 것이다.

우리는 이를 Local DB라고 부르며 SQLiteRoom이 있다.

 

RoomSQLite를 완벽히 활용하면서 원활한 데이터베이스 엑세스가 가능하도록 하는 업그레이드 버전이라 할 수 있다.

여러 장점이 있지만 반복적이고 오류가 발생하기 쉬운 상용구 코드를 최소화하는 것이 Room의 장점이다.

 

먼저 Room을 공부하기전 SQLite의 개념을 알고, Room을 공부할 예정이다!

 

이 글에서는 SQLite를 사용하기 위한 셋팅에 대해 다뤄보고 다음 글에서 본격적으로 MainActivity에서 어떻게 활용할 수 있는지

포스팅할 예정이다!!

class SQLiteHelperSample(context : Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION){

    companion object {

        private const val DATABASE_VERSION = 1 //데이터베이스 버전
        private const val DATABASE_NAME = "myTestDB.db" //데이터베이스 이름
        private const val TBL_NAME = "my_table" //테이블이름

        private const val ID = "id"
        private const val TITLE = "title"

    }

위와 같이 처음 데이터베이스의 버전과, 데이터베이스 이름, 그리고 테이블 이름, 테이블에 들어갈 컬럼들을 정의한다.

또한 위와 같이 class를 선언하면 테이블을 생성하는 onCreate와, 테이블의 버전을 업그레이드하는 onUpgrade의 함수를

오버라이드해서 새로 정의해야한다.

//테이블 만드는 구문
override fun onCreate(db: SQLiteDatabase?) {

    val SQL_CREATE_ENTRIES =
        "CREATE TABLE $TBL_NAME (" +
                "$ID INTEGER PRIMARY KEY," +
                "$TITLE TEXT)"

    db?.execSQL(SQL_CREATE_ENTRIES)

}

따라서 위와 같이 onCreate를 재정의하여 ID라는 기본키와 TITLE이라는 컬럼을 가지는 테이블을 만드는 함수를 만들었다.

// DATABASE VERSION 바뀔 때 기존 데이터베이스 버전에서 지워주는 작업을 함
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {

    db?.execSQL("DROP TABLE IF EXISTS $TBL_NAME")
    onCreate(db)

}

또한, 위처럼 Upgrade함수도 재정의 해주었다.

다음 이제 테이블의 행에 insert, 전체 행을 불러오는 select, 행 전체를 삭제하는 delete문을 구현해보자.

fun insert(str : String) {

    val db = this.writableDatabase

    val values = ContentValues().apply {
        put(TITLE, str) //TITLE의 값에 str을 넣겠다.
    }

    db.insert(TBL_NAME, null, values)

}

여기서 TITLE은 위에서 추가한 컬럼을 의미하고 str은 넣으려고 하는 값을 의미한다.

fun getAllData() : ArrayList<String> {

    val db = this.readableDatabase
    val query = "SELECT * FROM $TBL_NAME"

    val cursor = db.rawQuery(query, null)

    val arr = ArrayList<String>()

    with(cursor) {
        while (moveToNext()) {
            arr.add(getString(1)) //값을 하나씩 넣어줌
            //이는 ID값은 아니고, TITLE값을 의미함
        }
    }

    return arr
}

위는 cursor가 끝날 때 까지 다음 행으로 넘기면서 ID값은 넣지 않고, getString(1)을 통해 TITLE값을 arr에 넣고 반환하여

테이블의 모든 행을 출력한다.

fun deleteAll(){

    val db = this.writableDatabase
    db.execSQL("DELETE FROM $TBL_NAME")

}

DELETE를 통해 테이블의 전체 행을 삭제하는 함수를 만들어준다!

 

이로써 SQLite를 이용하기 위한 준비가 완료되었고, 다음 글에서 MainActivity에서 어떻게 활용할 수 있는지 포스팅할 예정이다!

 

 

GitHub - SsongSik/JetPack_Android_Practice: Android practice using the Jetpack library

Android practice using the Jetpack library. Contribute to SsongSik/JetPack_Android_Practice development by creating an account on GitHub.

github.com