본문 바로가기
안드로이드/데이터 입출력

안드로이드 sqlite 1

by 김어찐 2022. 6. 23.
728x90

안드로이드에서 사용하는 내장 데이터 베이스로 표준 SQL문을 사용하는 관계형 데이터 베이스이다.
MySQL 과 유사한 문법을 사용하고 있으며 일반적인 관계형 데이터 베이스가 가지고 있는 기능을 가지고 있다.

 

동작 방식

SQLite 데이터베이스는 임베디드형 데이터베이스로써 데이터베이스를 사용하는 애플리케이션에 셋팅되는 데이터 베이스이다.
안드로이드는 안드로이드 OS에 내장되어 있으며 개발자가 만드는 애플리케이션은 안드로이드 OS에게 쿼리문을 전달하고 안드로이드 OS가 직접 데이터 베이스에 대한 처리를 하게된다.

 

작성 방식

안드로이드에서의 SQLite 데이터베이스 사용은 쿼리문을 이용하는 방법과 제공되는 클래스를 이용하는 방법 두 가지가 있다.
쿼리문을 이용하는 방식은 일반적인 SQL문을 사용하며 MySQL과 유사한 문법을 사용한다.
클래스를 이용하는 방법은 개발자가 정해줘야 하는 몇 가지 정보를 제공하면 쿼리문이 생성되고 실행되는 구조이다.

 

SQLite OpenHelper

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

 

package com.example.sqlite1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import java.text.SimpleDateFormat
import java.util.*

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



        button.setOnClickListener {
            val helper = DBHelper(this)
            val sql = """
                insert into TestTable (textData,intData,floatData,dateData)
                values (?,?,?,?)
            """.trimIndent()

            // ?에 바인딩 될 값
            val sdf = SimpleDateFormat("yyy-MM-dd", Locale.getDefault())
            val now = sdf.format(Date())

            val arg1 = arrayOf("문자열1","100","11.11",now)
            val arg2 = arrayOf("문자열2","200","22.22",now)

            // 저장
            helper.writableDatabase.execSQL(sql,arg1)
            helper.writableDatabase.execSQL(sql,arg2)

            helper.writableDatabase.close()

            textView.text = "저장완료"
        }
        button2.setOnClickListener {
            val helper = DBHelper(this)

            val sql = "select * from TestTable"

            // 쿼리 실행
            val c1 = helper.writableDatabase.rawQuery(sql,null)
            textView.text=""

            while (c1.moveToNext()){
                // 가져올 컬럼의 인덱스 번호를 추출한다.
                val idx1 = c1.getColumnIndex("idx")
                val idx2 = c1.getColumnIndex("textData")
                val idx3 = c1.getColumnIndex("intData")
                val idx4 = c1.getColumnIndex("floatData")
                val idx5 = c1.getColumnIndex("dateData")

                // 데이터를 추출한다.
                val idx = c1.getInt(idx3)
                val textData = c1.getString(idx2)
                val intData = c1.getInt(idx3)
                val floatData = c1.getDouble(idx4)
                val dateData = c1.getString(idx5)

                textView.append("idx : $idx\n")
                textView.append("textData : $textData\n")
                textView.append("intData : $intData\n")
                textView.append("floatData : $floatData\n")
                textView.append("dateData : $dateData")
            }
            helper.writableDatabase.close()
        }

        button3.setOnClickListener {
            val helper = DBHelper(this)

            val sql = "update TestTable set textData = ? where idx = ?"
            val arg1 = arrayOf("문자열3","1")

            helper.writableDatabase.execSQL(sql,arg1)
            helper.writableDatabase.close()

            textView.text = "수정완료"
        }

        button4.setOnClickListener {
            val helper = DBHelper(this)

            val sql = "delete from TestTable where idx = ?"
            val arg1 = arrayOf("1")

            helper.writableDatabase.execSQL(sql,arg1)
            helper.writableDatabase.close()

            textView.text = "삭제완료"
        }
    }
}

package com.example.sqlite1

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

class DBHelper : SQLiteOpenHelper {
    constructor(context:Context) :super(context,"Test.db",null,1)

    // 데이터 베이스 파일이 없을 경우 파일을 만들고 자동으로 호출된다.
    // 어플리케이션 설치 후 최초로 접근시 호출
    // 최신 형태의 테이블을 생성하는 쿼리문을 작성한다
    override fun onCreate(p0: SQLiteDatabase?) {
        Log.d("test","DB 생성 완료")

        val sql = """
            create table TestTable
            (idx integer primary key autoincrement,
            textData text not null,
            intData integer not null,
            floatData real not null,
            dateData date not null)
        """.trimIndent()
        p0?.execSQL(sql)
    }

    // 버전이 변경된 경우 호출된다.
    // 기존에 앱을 사용하는 사용자를 위해 테이블의 구조를 최신 형태로 만들어주는 쿼리문을 작성한다.
    override fun onUpgrade(p0: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        Log.d("test","onUprade $oldVersion -> $newVersion")
        if(oldVersion ==1){
            Log.d("test","old 1")
        }
        else if(oldVersion ==2){
            Log.d("test","old 2")
        }
    }
}
728x90

'안드로이드 > 데이터 입출력' 카테고리의 다른 글

안드로이드 Content Provider  (0) 2022.06.23
안드로이드 sqlite 2  (0) 2022.06.23
안드로이드 assets  (0) 2022.06.22
안드로이드 파일 입출력  (0) 2022.06.21
안드로이드 Application Class  (0) 2022.06.21