๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš€ Development/Android

[์•ˆ๋“œ๋กœ์ด๋“œ] Local DB SQLite ์ด๋ž€? (์‚ฌ์šฉ๋ฒ• ์˜ˆ์ œ)

by Jay Din 2023. 5. 17.
728x90
๋ฐ˜์‘ํ˜•

SQLite ๋ž€?

SQLite๋Š” ์˜คํ”ˆ ์†Œ์Šค ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(RDBMS)์œผ๋กœ, ์ž‘๊ณ  ๊ฒฝ๋ นํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์ด๋‹ค.

์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋„ฃ์–ด ์‚ฌ์šฉํ•˜๋Š” ๋น„๊ต์  ๊ฐ€๋ฒผ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‹ค.

 

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDBMS)

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDBMS)๋Š” Table ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

์ด ํ…Œ์ด๋ธ”์€ Key-value์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋ฐ์ดํ„ฐ์˜ ์ข…์†์„ฑ์„ ๊ด€๊ณ„๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠน์ง•์ด๋‹ค.

์ข…๋ฅ˜๋กœ๋Š” MySQL, MSSql, MariaDB, Oracle, H2, sqlite ๋“ฑ์ด ์žˆ๋‹ค.

ํŠน์ง•

  • ๋ฐ์ดํ„ฐ์˜ ๋ถ„๋ฅ˜, ์ •๋ ฌ, ํƒ์ƒ‰ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.
  • ์‹ ๋ขฐ์„ฑ์ด ๋†’๊ณ , ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋„๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
  • ๊ธฐ์กด์— ์ž‘์„ฑ๋œ ์Šคํ‚ค๋งˆ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. 
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ถ€ํ•˜ ๋ถ„์„์ด ์–ด๋ ต๋‹ค.

 

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ SQLite ์‚ฌ์šฉ์ด์œ  

1. ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ง€์›ํ•˜๋Š” ๋‚ด์žฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

SQLite๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ํ”Œ๋žซํผ์—์„œ ๋‚ด์žฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ง€์›๋œ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ SQLite๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ„๋„๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†”๋ฃจ์…˜์„ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋งคํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์—,

์•ฑ ๊ฐœ๋ฐœ ์†๋„์™€ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

2. ๊ฒฝ๋Ÿ‰ํ™”๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

SQLite๋Š” ๊ฒฝ๋ นํ™”๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

์ด๋Š” ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์™€ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ œํ•œ๋œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

3. ์‰ฌ์šด ๊ตฌํ˜„๊ณผ ๊ด€๋ฆฌ

SQLite๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ๋„ ๊ฐ„๋‹จํ•˜๋‹ค.

SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋„๊ตฌ๊ฐ€ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”Œ๋žซํผ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋œ๋‹ค.

์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋“œ๋Š” ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. 

๋‹จ์ 

  • ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.
  • ๋™์‹œ์— ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ ‘๊ทผํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ผ๋ถ€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ(์˜ˆ: ์Šคํ† ์–ด๋“œ ํ”„๋กœ์‹œ์ €)์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์ œํ•œ์ ์ด๋ฉฐ, ์ •๊ตํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ

๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์ „์ฒด ์‚ญ์ œ, ๋ฐ์ดํ„ฐ ์ „์ฒด ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋“ฑ์„ ์˜ˆ์ œ๋กœ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.

MySQL ๋ฌธ๋ฒ•๊ณผ ๋™์ผํ•˜๋‹ค.

๋ฐ˜์‘ํ˜•

 

SQLiteHelperSample.kt

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

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"
    }

    // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ
    override fun onCreate(db: SQLiteDatabase?) {
        val SQL_CREATE_ENTERIES =
            "CREATE TABLE $TBL_NAME (" +
                    "$ID INTEGER PRIMARY KEY," +
                    "$TITLE TEXT)"

        db?.execSQL(SQL_CREATE_ENTERIES)
    }

    // ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
    fun insert(str: String) {
        val db = this.writableDatabase
        val values = ContentValues().apply {
            put(TITLE, str)
        }
        db.insert(TBL_NAME, null, values)
    }

    // ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
    fun getAllData(): ArrayList<String> {
        val db = this.readableDatabase
        val query = "SELECT * FROM $TBL_NAME"
        val arr = ArrayList<String>()
        val cursor = db.rawQuery(query, null)

        with(cursor) {
            while (moveToNext()) {
                arr.add(getString(1))
            }
        }


        return arr
    }

    // ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ง€์šฐ๊ธฐ
    fun deleteAll() {
        val db = this.writableDatabase
        db?.execSQL("DROP TABLE IF EXISTS $TBL_NAME")
    }

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

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

    }

}

MainActivity.kt

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

class MainActivity : AppCompatActivity() {

    lateinit var db : SQLiteHelperSample

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

        db = SQLiteHelperSample(this)

        val inputArea = findViewById<EditText>(R.id.inputArea)
        val insertBtn = findViewById<Button>(R.id.insert)
        val getAllBtn = findViewById<Button>(R.id.getAll)
        val deleteBtn = findViewById<Button>(R.id.deleteAll)
        val resultBtn = findViewById<TextView>(R.id.resultArea)

        // ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
        insertBtn.setOnClickListener {
            val inputText = inputArea.text.toString()
            db.insert(inputText)
            inputArea.setText("")
        }

        // ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
        getAllBtn.setOnClickListener {
            val arr = db.getAllData()
            resultBtn.text = arr.toString()
        }

        // ๋ฐ์ดํ„ฐ ์‚ญ์ œ
        deleteBtn.setOnClickListener {
            db.deleteAll()
        }

    }

    override fun onDestroy() {
        super.onDestroy()
        db.close()
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <EditText
            android:id="@+id/inputArea"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/insert"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="insert" />

        <Button
            android:id="@+id/getAll"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="getAll" />

        <Button
            android:id="@+id/deleteAll"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="deleteAll" />

        <TextView
            android:id="@+id/resultArea"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="resultArea"
            android:textSize="30sp" />

    </LinearLayout>


</androidx.constraintlayout.widget.ConstraintLayout>
๋ฐ˜์‘ํ˜•

 

์‹คํ–‰ํ™”๋ฉด

EditText๋ฅผ ํ†ตํ•ด 123, 423, 1, 2 ์ˆœ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์ „์ฒด ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

๊ฒฐ๋ก  

์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ๊ฐœ๋ฐœ์—์„œ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”,

๋‚ด์žฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ง€์›๋˜๋Š”๊ฒฝ๋Ÿ‰ํ™”๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฉฐ, ๊ตฌํ˜„๊ณผ ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ, ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†”๋ฅ˜์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹จ์ ์œผ๋กœ๋Š” ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๊ณ , ๋™์‹œ์— ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ ‘๊ทผํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ ์•ˆ๋‚ด๋ฌธ

SQLite๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ฟผ๋ฆฌ๋ฌธ์„ ์ „๋ถ€ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ตฌ๊ธ€์€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ROOM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐœํ‘œํ•˜์˜€๋‹ค. 

 

 


์ฐธ๊ณ 

https://velog.io/@jinny_0422/SQLite-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0#-%EA%B4%80%EA%B3%84%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4

 

[Android] SQLite ์‚ฌ์šฉํ•˜๊ธฐ

SQLite๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด๋‹ค. ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋„ฃ์–ด ์‚ฌ์šฉํ•˜๋Š” ๋น„๊ต์  ๊ฐ€๋ฒผ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋‹ค.

velog.io

https://velog.io/@hinyc/59.-%EA%B4%80%EA%B3%84%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-feat.-SQL

 

59. ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (feat. SQL)

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ž€ ? ํŠน์ง• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์ ์…˜์˜ ACIDํŠน์„ฑ ์šฉ์–ด โžŠ ์—ด(column) โž‹ ํ–‰(row) โžŒ ๊ฐ’(value) โž ํ‚ค(key) โžŽ ๊ด€๊ณ„(relationship) โž ์Šคํ‚ค๋งˆ(Schema) SQL NoSQL

velog.io

https://blacktrees.tistory.com/entry/Android-SQLite-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94

 

[Android] SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?

๋ชฉ์ฐจ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ž€? ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ ์ด์œ  SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์žฅ๋‹จ์  ๊ฒฐ๋ก  1. SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ž€? SQLite๋Š” ์˜คํ”ˆ ์†Œ์Šค ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(RDBMS)

blacktrees.tistory.com

 

728x90
๋ฐ˜์‘ํ˜•