Android : Sqlite

Beautify.log·2022년 2월 10일
0

Android with Kotlin

목록 보기
17/17
post-thumbnail

개요


웹에서의 DB

웹에서는 클라이언트(화면단)가 서버에 어떤 정보를 달라고 요청할 때, 서버는 데이터베이스로부터 그 정보를 꺼내서 클라이언트로 보내줍니다.

Spring으로 예를 들면 DAO를 통해 DB에 접근하게 되는데 이 때 중간다리 역할로 MyBatis 같은 도구를 사용합니다.

이는 클라이언트, 서버, DB가 각각 독립된 환경임을 가정했을 때 성립할 수 있습니다.

안드로이드의 DB

물론 안드로이드에서도 독립된 DB로부터 데이터를 받아와서 화면단에 표현해 줄 수 있습니다.

그렇지만 굳이 외부에 있는 DB에 접근해서 정보를 가져올 필요가 없을 때, 다시 말해서 내부적으로만 데이터 교환이 이루어지는 경우가 있다고 가정한다면 외부에서 데이터를 가져오는 것은 다소 비효율적일 수 있습니다.

그래서 기기 내부에서만 사용할 수 있는 DB 시스템을 제공하는데, 안드로이드에서는 이 서비스를 Sqlite라는 이름으로 제공합니다.


Sqlite 사용하기


DBHelper 작성하기

우선 DBHelper가 필요합니다. 이는 클래스이며 다음과 같이 작성합니다.

class DBHelper(context: Context?, 
			   name: String?, 
               factory: SQLiteDatabase.CursorFactory?, 
               version: Int)
              : SQLiteOpenHelper(context, name, factory, version)

이 클래스는 멤버변수로 context, name, factory, version을 갖고 SQLiteOpenHelper 클래스를 상속 받습니다.

내부에는 기본적으로 onCreateonUpgrade가 오버라이드 되어야 합니다.

class DBHelper(context: Context?, 
			   name: String?, 
               factory: SQLiteDatabase.CursorFactory?, 
               version: Int)
              : SQLiteOpenHelper(context, name, factory, version) {
	override fun onCreate(db: SQLiteDatabase?) {
        // 테이블 생성
        var sql : String = " CREATE TABLE IF NOT EXISTS TEST( " +
                           "    SEQ INTEGER PRIMARY KEY AUTOINCREMENT, " +
                           "    TXT TEXT) "

        db?.execSQL(sql)
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        var sql : String = " DROP TABLE IF EXISTS TEST "
        db?.execSQL(sql)
        onCreate(db)
    }
}

내부에는 SQL 쿼리문이 들어가며 execSQL을 통해 쿼리문을 실행시켜줍니다.

CRUD를 구성하여 보았습니다.

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

class DBHelper(context: Context?, name: String?, factory: SQLiteDatabase.CursorFactory?, version: Int)
              : SQLiteOpenHelper(context, name, factory, version) {

    override fun onCreate(db: SQLiteDatabase?) {
        // 테이블 생성
        var sql : String = " CREATE TABLE IF NOT EXISTS TEST( " +
                           "    SEQ INTEGER PRIMARY KEY AUTOINCREMENT, " +
                           "    TXT TEXT) "

        db?.execSQL(sql)
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        var sql : String = " DROP TABLE IF EXISTS TEST "
        db?.execSQL(sql)
        onCreate(db)
    }

    // CRUD
    fun insert(db:SQLiteDatabase, txt:String) {
        val sql = " INSERT INTO TEST(TXT) " +
                  " VALUES('${txt}') "
        db.execSQL(sql)
    }

    @SuppressLint("Range")
    fun read(db:SQLiteDatabase, txt: String) : String? {
        val sql = " SELECT TXT FROM TEST " +
                  " WHERE TXT = '$txt' "

        var res = db.rawQuery(sql, null)

        var str:String? = ""
        while(res.moveToNext()) {
            str += res.getString(res.getColumnIndex("SEQ")) + " " + "" + res.getString(res.getColumnIndex("TXT"))
        }

        return str
    }

    fun update(db:SQLiteDatabase, txt:String, wantToEdit:String) {
        val sql = " UPDATE TEST " +
                  " SET TXT = '$wantToEdit'" +
                  " WHERE TXT = '$txt' "
        db.execSQL(sql)
    }

    fun delete(db:SQLiteDatabase, txt:String) {
        val sql = " DELETE FROM TEST " +
                  " WHERE TXT = '$txt' "
        db.execSQL(sql)
    }
}

MainActivity에서 CRUD 사용

package com.example.sample36

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // db에 넣어주기
        var dbHelper = DBHelper(this, "testdb.db", null, 1)

        val insertBtn = findViewById<Button>(R.id.insertBtn)
        val editInsert = findViewById<EditText>(R.id.editInsert)
        val wantToEdit = findViewById<EditText>(R.id.wantToEdit)

        val textView = findViewById<TextView>(R.id.textView)
        val readBtn = findViewById<Button>(R.id.readBtn)
        val updateBtn = findViewById<Button>(R.id.updateBtn)
        val deleteBtn = findViewById<Button>(R.id.delBtn)

        val database = dbHelper.writableDatabase
        val db = dbHelper.readableDatabase

        // CREATE
        insertBtn.setOnClickListener {
            val txt = editInsert.text
            dbHelper.insert(database, txt.toString())
        }

        // READ
        readBtn.setOnClickListener {
            val txt = arrayOf(editInsert.text)
            val res:String? = dbHelper.read(db, txt.toString())
            textView.text = res
        }

        // UPDATE
        updateBtn.setOnClickListener {
            val txt = editInsert.text
            val wantEdit = wantToEdit.text
            dbHelper.update(database, txt.toString(), wantEdit.toString())
        }

        // DELETE
        deleteBtn.setOnClickListener {
            val txt = editInsert.text
            dbHelper.delete(database, txt.toString())
        }

    }
}
profile
tried ? drinkCoffee : keepGoing;

0개의 댓글