앱을 이용하다보면 네트워크가 끊겼을 때 네트워크 오류입니다. 다시 시도해 주세요 라는 메세지를 본 적이 있다.
하지만 카카오톡 채팅방처럼 네트워크가 연결되어 있지 않은 상황에서도 잘 보이고 있는 것을 알 수 있다.
서버에서 불러오는 방식일 수도 있지만 다른 곳에다가 저장을 해두고, 불러오는 방식을 사용할 수 있을 것이다.
우리는 이를 Local DB라고 부르며 SQLite와 Room이 있다.
Room은 SQLite를 완벽히 활용하면서 원활한 데이터베이스 엑세스가 가능하도록 하는 업그레이드 버전이라 할 수 있다.
여러 장점이 있지만 반복적이고 오류가 발생하기 쉬운 상용구 코드를 최소화하는 것이 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에서 어떻게 활용할 수 있는지 포스팅할 예정이다!
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] ROOM(1) (0) | 2022.09.02 |
---|---|
[JETPACK개론] SQLite(2) (0) | 2022.08.30 |
[JETPACK개론] Retrofit + ViewModelScope + RV + Glide (0) | 2022.08.28 |
[JETPACK개론] Retrofit 예제 + RecyclerView (0) | 2022.08.27 |
[JETPACK개론] Coroutine / ViewModelScope (0) | 2022.08.26 |