๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Study/Android

[์•ˆ๋“œ๋กœ์ด๋“œ ์ฝ”ํ‹€๋ฆฐ] 13. DB ํ”„๋กœ์ ํŠธ - ๊ทธ๋ฃน ๊ด€๋ฆฌ

DB ํ”„๋กœ์ ํŠธ

 

๊ทธ๋ฃน ๊ด€๋ฆฌ

[์ฐธ๊ณ ] ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ• ์„ค๋ช…
๊ณต์œ  ํ”„๋ ˆํผ๋Ÿฐ์Šค(Shared Preferences) ํ‚ค-๊ฐ’ ์Œ(key-value pair)์œผ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ
๋‚ด๋ถ€ ์ €์žฅ(Internal Storage) ๋‚ด๋ถ€ ์ €์žฅ์†Œ์— ์ €์žฅ
์™ธ๋ถ€ ์ €์žฅ(External Storage) ์™ธ๋ถ€ ์ €์žฅ์†Œ์— ์ €์žฅ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Database) ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ
๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ(Network Connection) ๋ฐ์ดํ„ฐ๋ฅผ ๋„คํŠธ์›Œํฌ ์„œ๋ฒ„์— ์ €์žฅ

- ๋‚ด๋ถ€ ์ €์žฅ์†Œ์˜ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ ์ œ๊ฑฐํ•˜๋ฉด ํŒŒ์ผ๋„ ๊ฐ™์ด ์ œ๊ฑฐ๋จ

- ์™ธ๋ถ€์ €์žฅ: SD์นด๋“œ ๊ฐ™์€ ์™ธ๋ถ€ ์ €์žฅ์†Œ ํ•„์š”. ๋ชจ๋“  ์•ฑ๋“ค์ด ๋‹ค ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ(๊ณต์œ  ํ•„์š”ํ•œ ํŒŒ์ผ์— ์ ํ•ฉ)

- ๋‚ด๋ถ€์™€ ์™ธ๋ถ€๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฐ€์žฅ ํฐ ํŠน์ง•: permission

    - ๋‚ด๋ถ€: permission ํ•„์š” ์—†์Œ

    - ์™ธ๋ถ€: ๋ฐ˜๋“œ์‹œ permission ํ•„์š”(์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด)

 

- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: SQLite์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งํ•จ

    - ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ํ†ต์‹ ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ

 

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๊ธฐ๋ณธ ๊ฐœ๋…

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

์„œ๋กœ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๊ฒƒ

 

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(DataBase Management System, DBMS)

    - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์‹œ์Šคํ…œ ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด

- ๋ฐ์ดํ„ฐ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉ์ž๋“ค์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ

- DBMS์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์šฉ์–ด

- DBMS : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งํ•จ

- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB) : ํ…Œ์ด๋ธ”์ด ์ €์žฅ๋˜๋Š” ์žฅ์†Œ๋กœ ์ฃผ๋กœ ์›ํ†ต ๋ชจ์–‘์œผ๋กœ ํ‘œํ˜„

    - ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ณ ์œ ํ•œ ์ด๋ฆ„์ด ์žˆ์–ด์•ผ ํ•จ

- ํ…Œ์ด๋ธ” : ํ‘œ ํ˜•ํƒœ๋กœ ํ‘œํ˜„๋œ ๊ฒƒ

- ๋ฐ์ดํ„ฐ : ํ•˜๋‚˜ํ•˜๋‚˜์˜ ๋‹จํŽธ์ ์ธ ์ •๋ณด๋ฅผ ๋œปํ•จ

- ์—ด(์นผ๋Ÿผ ๋˜๋Š” ํ•„๋“œ) : ๊ฐ ํ…Œ์ด๋ธ”์€ 1๊ฐœ ์ด์ƒ์˜ ์—ด๋กœ ๊ตฌ์„ฑ๋จ

- ์—ด ์ด๋ฆ„ : ๊ฐ ์—ด์„ ๊ตฌ๋ถ„ํ•˜๋Š” ์ด๋ฆ„, ์—ด ์ด๋ฆ„์€ ๊ฐ ํ…Œ์ด๋ธ” ์•ˆ์—์„œ๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š์•„์•ผ ํ•จ 

- ๋ฐ์ดํ„ฐ ํ˜•์‹ : ์—ด์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ๋œปํ•จ 

    - ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ ์—ด ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ์ง€์ •ํ•ด์•ผ ํ•จ 

- ํ–‰(๋กœ์šฐ) : ์‹ค์ œ ๋ฐ์ดํ„ฐ

- SQL : ์‚ฌ์šฉ์ž์™€ DBMS๊ฐ€ ์†Œํ†ตํ•˜๊ธฐ ์œ„ํ•œ ์–ธ์–ด

 

 

SQLite์—์„œ์˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๊ตฌ์ถ•

SQLite

- ์•ˆ๋“œ๋กœ์ด๋“œ ํฐ์— ๋‚ด์žฅ๋˜์–ด์žˆ๋Š” ๊ฐ€๋ฒผ์šด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

- ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ‘œ์ค€ SQL๊ณผ ์ผ๋ถ€ ์ถ”๊ฐ€์  ๊ธฐ๋Šฅ ์ œ๊ณต

 

์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ SQLite ๋™์ž‘ ๋ฐฉ์‹

 

์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ SQLite ๋™์ž‘ ๋ฐฉ์‹

๊ฐ ํด๋ž˜์Šค์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ

 


SQLite GUI ํˆด ํ™œ์šฉํ•˜์—ฌ ์•ฑ ๊ฐœ๋ฐœ

DB Browser for SQLite

- https://sqlitebrowser.org/

 

DB Browser for SQLite

DB Browser for SQLite The Official home of the DB Browser for SQLite Screenshot What it is DB Browser for SQLite (DB4S) is a high quality, visual, open source tool to create, design, and edit database files compatible with SQLite. DB4S is for users and dev

sqlitebrowser.org

 

- DB Browser์— ๋Œ€ํ•œ ๊ฒƒ๋งŒ ์‚ฌ์šฉํ•  ์˜ˆ์ •

 

์ฃผ์š” ๊ตฌ์„ฑ 

- ๊ทธ๋ฃน์˜ ์ด๋ฆ„๊ณผ ์ธ์›์„ ์ž…๋ ฅํ•˜๊ณ  ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ ๏‚ง SQLite์„ ์‚ฌ์šฉ

 

1. ํ™”๋ฉด ์ž‘์„ฑํ•˜๊ธฐ

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="์ด๋ฆ„ : "
            android:textSize="20dp" />

        <EditText
            android:id="@+id/edtName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="์ธ์› : "
            android:textSize="20dp" />

        <EditText
            android:id="@+id/edtNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btnInit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="์ดˆ๊ธฐํ™”" />

        <Button
            android:id="@+id/btnInsert"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="์ž…๋ ฅ" />

        <Button
            android:id="@+id/btnSelect"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="์กฐํšŒ" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="8"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/edtNameResult"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="#DDDDFC"
            android:padding="20dp"
            android:layout_weight="1" />

        <EditText
            android:id="@+id/edtNumberResult"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="#DDDDFC"
            android:padding="20dp"
            android:layout_weight="1" />

    </LinearLayout>

</LinearLayout>

 


[์ฐธ๊ณ ] ์ฟผ๋ฆฌ(SQL)

์ฟผ๋ฆฌ

- SQL: ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜, ์กฐ์ž‘, ์ œ์–ดํ•˜๋Š” ์šฉ๋„์˜ ์–ธ์–ด๋กœ ์‚ฌ์šฉ

- ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ SQL ๊ตฌ๋ฌธ ๋˜๋Š” ์ฟผ๋ฆฌ(Query)๋ผ๊ณ  ํ•จ

- ์ƒ์„ฑ๊ณผ ๊ด€๋ จ๋œ ์ฟผ๋ฆฌ

- ๊ทธ์™ธ์˜ ์ฟผ๋ฆฌ๋Š” ํ…Œ์ด๋ธ”์— ์ฝ๊ณ  ์“ฐ๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๋ช…๋ น์–ด

 

์ฟผ๋ฆฌ์˜ ์ข…๋ฅ˜

- DDL: ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •์˜

 

- DML: ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘

 

ํ…Œ์ด๋ธ” ์ƒ์„ฑ

CREATE TABLE ํ…Œ์ด๋ธ” ์ด๋ฆ„ (์—ด์ด๋ฆ„1 ๋ฐ์ดํ„ฐํ˜•์‹1, ์—ด์ด๋ฆ„2 ๋ฐ์ดํ„ฐํ˜•์‹2, ... );

CREATE TABLE userTable (id char(4), username char(15), email char(15) );

 

๋ฐ์ดํ„ฐ ์ž…๋ ฅ 

INSERT INTO ํ…Œ์ด๋ธ”์ด๋ฆ„ VALUES(๊ฐ’1, ๊ฐ’2, ... );

INSERT INTO userTable VALUES (‘swu’, ‘Lee’, ‘lee@swu.ac.kr’ );

 

๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฐ ํ™œ์šฉ

SELECT ์—ด์ด๋ฆ„1, ์—ด์ด๋ฆ„2, ... FROM ํ…Œ์ด๋ธ”์ด๋ฆ„
SELECT ์—ด์ด๋ฆ„1, ์—ด์ด๋ฆ„2, ... FROM ํ…Œ์ด๋ธ”์ด๋ฆ„ WHERE ์กฐ๊ฑด;

SELECT * FROM userTable; 

SELECT * FROM userTable WHERE id = ‘swu’;


 

2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉํ•˜๊ธฐ

DB ์ƒ์„ฑํ•˜๊ธฐ 

- SQLiteOpenHelper ํด๋ž˜์Šค์—์„œ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ ํ›„ ์ƒ์„ฑ์ž ์ˆ˜์ •

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
    
    inner class myDBHelper(context: Context) : SQLiteOpenHelper(context, "groupDB", null, 1) {
        override fun onCreate(db: SQLiteDatabase?) {
            TODO("Not yet implemented")
        }

        override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
            TODO("Not yet implemented")
        }
    }
}

- SQLitePenHelper(ํด๋ž˜์Šค, DB ํŒŒ์ผ๋ช…, ์ปค์„œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜(null: ํ‘œ์ค€ ์ปค์„œ), DB๋ฒ„์ „(์ƒ์„ฑ๋œ DB๊ฐ€ ์ฒ˜์Œ์ด๋ฏ€๋กœ 1))

- onUpgrade(db: SQLiteDatabase?, ํ˜„์žฌ๋ฒ„์ „, ์ƒˆ๋กœ๋ฐ›์„๋ฒ„์ „)

 

ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ ๋ณ€๊ฒฝํ•˜๊ธฐ

- myDBHelper ํด๋ž˜์Šค์˜ onCreate( )์™€ onUpgrade( ) ๋ฉ”์†Œ๋“œ ์ฝ”๋”ฉ

    - onCreate( ) ๋ฉ”์†Œ๋“œ : ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑ

    - onUpgrade( ) ๋ฉ”์†Œ๋“œ : ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•œ ํ›„ ๋‹ค์‹œ ์ƒ์„ฑ

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

    inner class myDBHelper(context: Context) : SQLiteOpenHelper(context, "groupDB", null, 1) {   // inner class: ๋‚ด๋ถ€ ํด๋ž˜์Šค (DB๊ฐ์ฒด ์ƒ์„ฑ ์ •๋ณด, DB๋ช…, ์ปค์„œ๊ฐ’, ๋ฒ„์ „)
        override fun onCreate(db: SQLiteDatabase?) {
            db!!.execSQL("CREATE TABLE groupTBL (gName CHAR(20) PRIMARY KEY, gNumber Integer);")        // CREATE TABLE:ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๋Š” SQL๋ฌธ, groupTBL:๊ทธ๋ฃน๋ช… (์—ด ์ด๋ฆ„ ๊ฐ’)) // ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋กœ ์ž‘์„ฑ(์‹๋ณ„ ํ‚ค)
        }

        override fun onUpgrade(db: SQLiteDatabase?, p1: Int, p2: Int) {
            db!!.execSQL("DROP TABLE IF EXISTS groupTBL")      // ํ…Œ์ด๋ธ” ์‚ญ์ œํ•˜๋Š” SQL๋ฌธ:DROP TABLE, IF EXISTS:ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•  ๋•Œ๋งŒ ์‚ญ์ œ
            onCreate(db)    // ์ƒ์„ฑํ•  ๋• onCreat() ํ˜ธ์ถœ
        }
    }
}

 

SQLiteOpenHelper ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ

 


์ปค์„œ ์ธํ„ฐํŽ˜์ด์Šค

๊ฒฐ๊ณผ ์ง‘ํ•ฉ(Result Sets)๊ณผ ์ปค์„œ(Cursors) 

- rawQuery()

    - SELECT๋ฌธ์œผ๋กœ ๊ฒฐ๊ณผ์ง‘ํ•ฉ์„ ๋ฆฌํ„ดํ•  ๋•Œ ์‚ฌ์šฉ

    - ์‹คํ–‰ ๊ฒฐ๊ณผ์˜ ์–‘์ด ๋งŽ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฒฐ๊ณผ์ง‘ํ•ฉ ์ž์ฒด๊ฐ€ ๋ฆฌํ„ด๋˜์ง€ ์•Š์œผ๋ฉฐ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค์„œ๋กœ ๋ฆฌํ„ด๋จ

- ์ปค์„œ(Cursor) 

    - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋กœ ๋ฆฌํ„ด๋œ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋ณด

    - ๋ ˆ์ฝ”๋“œ ์ง‘ํ•ฉ์˜ ๊ฐœ๋ณ„ ๋ ˆ์ฝ”๋“œ์— ์ ‘๊ทผํ•˜์—ฌ ๊ทธ ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

 

์ปค์„œ(Cursors) ๋ฉ”์†Œ๋“œ


 

3. ์œ„์ ฏ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ํ•˜๊ธฐ

์œ„์ ฏ ๋ณ€์ˆ˜ ์„ ์–ธ

- ๋ฉ”์ธ ์•กํ‹ฐ๋น„ํ‹ฐ ํด๋ž˜์Šค์— ๋‹ค์Œ ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ

    - myDBHelper ํด๋ž˜์Šค ๋ณ€์ˆ˜

    - ์—๋””ํŠธํ…์ŠคํŠธ์— ๋Œ€์‘ํ•  ๋ณ€์ˆ˜ 4๊ฐœ (์ด๋ฆ„, ์ธ์›, ์ด๋ฆ„๊ฒฐ๊ณผ, ์ธ์›๊ฒฐ๊ณผ)

    - ๋ฒ„ํŠผ์— ๋Œ€์‘ํ•  ๋ณ€์ˆ˜ 3๊ฐœ (์ดˆ๊ธฐํ™”, ์ž…๋ ฅ, ์กฐํšŒ)

    - SQLiteDatabase ํด๋ž˜์Šค ๋ณ€์ˆ˜

- onCreate( )์—์„œ๋Š” ์œ„์ ฏ ๋ณ€์ˆ˜์— activity_main.xml์˜ 7๊ฐœ ์œ„์ ฏ์„ ๋Œ€์ž…

 

๊ทธ๋ฃน ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

- <์ดˆ๊ธฐํ™”>๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋™์ž‘ํ•˜๋Š” ๋ฆฌ์Šค๋„ˆ ๊ตฌํ˜„

 

- <์ž…๋ ฅ>์„ ํด๋ฆญํ•˜๋ฉด ์—๋””ํŠธํ…์ŠคํŠธ์˜ ๊ฐ’์ด ์ž…๋ ฅ๋˜๋Š” ๋ฆฌ์Šค๋„ˆ ์ฝ”๋”ฉ

    - ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ช‡ ๊ฑด ์ž…๋ ฅํ–ˆ์„ ๋•Œ ‘์ž…๋ ฅ๋จ’ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ด

 

 

- <์กฐํšŒ>๋ฅผ ํด๋ฆญํ•  ๋•Œ, ์ž…๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๋ฆฌ์Šค๋„ˆ ์ฝ”๋”ฉ

    - ํ…Œ์ด๋ธ”์— ์ž…๋ ฅ๋œ ๋‚ด์šฉ์ด ๋ชจ๋‘ ์•„๋ž˜์ชฝ ์—๋””ํŠธํ…์ŠคํŠธ์— ์ถœ๋ ฅ๋˜๋„๋ก ํ•จ

 

* : ๋ชจ๋‘ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉ

class MainActivity : AppCompatActivity() {

    lateinit var edtName: EditText
    lateinit var edtNumber: EditText
    lateinit var edtNameResult: EditText
    lateinit var edtNumberResult: EditText
    lateinit var btnInit: Button
    lateinit var btnInsert: Button
    lateinit var btnSelect: Button

    lateinit var myHelper: myDBHelper       // myDBHelper ํด๋ž˜์Šค ๋ณ€์ˆ˜
    lateinit var sqlDB: SQLiteDatabase      // SQLite์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€์ˆ˜

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

        edtName = findViewById(R.id.edtName)
        edtNumber = findViewById(R.id.edtNumber)
        edtNameResult = findViewById(R.id.edtNameResult)
        edtNumberResult = findViewById(R.id.edtNumberResult)

        btnInit = findViewById(R.id.btnInit)
        btnInsert = findViewById(R.id.btnInsert)
        btnSelect = findViewById(R.id.btnSelect)

        myHelper = myDBHelper(this)    // myDBHelper๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด ๋ฐ›์•„์˜ค๊ธฐ

        btnInit.setOnClickListener {
            sqlDB = myHelper.writableDatabase       // myHelper ์ธ์Šคํ„ด์Šค๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด ๋ฐ›์•„์˜ค๊ธฐ
            myHelper.onUpgrade(sqlDB, 1, 2)    // ํ…Œ์ด๋ธ” ๊ฐฑ์‹  (DB์ •๋ณด, ํ˜„์žฌ๋ฒ„์ „, ๋ฐ”๋€”๋ฒ„์ „) (๋ฒ„์ „ ์‚ฌ์šฉํ•œ ์  ์—†์œผ๋ฏ€๋กœ ์•„๋ฌด ์ˆซ์ž ๋„ฃ์–ด๋„ ๋จ ex.100 200)
            sqlDB.close()           // DB ๋‹ซ๊ธฐ
        }

        btnInsert.setOnClickListener {
            sqlDB = myHelper.writableDatabase

            sqlDB.execSQL("INSERT INTO groupTBL VALUES ('" + edtName.text.toString() + "', "
                    + edtNumber.text.toString() + ");")       // sql ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก.. groupTBL: ๋‚ด์šฉ์ด ์‚ฝ์ž…๋  ํ…Œ์ด๋ธ” / VALUES: ๊ฐ’
            sqlDB.close()           // DB ๋‹ซ๊ธฐ
            Toast.makeText(applicationContext, "์ž…๋ ฅ๋จ", Toast.LENGTH_SHORT).show()
        }

        btnSelect.setOnClickListener {
            sqlDB = myHelper.readableDatabase       // ์ฝ๊ธฐ์ „์šฉ์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ

            var cursor: Cursor  // ์ปค์„œ ๋ณ€์ˆ˜ ์ƒ์„ฑ
            cursor = sqlDB.rawQuery("SELECT * FROM groupTBL;", null)       // *: gropTBL์— ์žˆ๋Š” ๋ชจ๋“  colums ๊ฐ€์ ธ์˜ค๊ธฐ, null: ์•ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ธ์ž๊ฐ’์ด ์—†์œผ๋ฏ€๋กœ

            // ๋ ˆ์ฝ”๋“œ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด ์ด๋ฆ„๊ณผ ์ธ์› ๋ช…์‹œ
            var strNames = "๊ทธ๋ฃน์ด๋ฆ„" + "\r\n" + "--------" + "\r\n"
            var strNumbers = "์ธ์›" + "\r\n" + "--------" + "\r\n"

            // while๋ฌธ์„ ํ†ตํ•ด ์ปค์„œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ด๋™์‹œํ‚ค๋ฉฐ ๋ ˆ์ฝ”๋“œ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
            while(cursor.moveToNext()) {
                strNames += cursor.getString(0) + "\r\n"     // ์ปค์„œ 0๋ฒˆ์งธ
                strNumbers += cursor.getString(1) + "\r\n"     // ์ปค์„œ 1๋ฒˆ์งธ
            }

            edtNameResult.setText(strNames)
            edtNumberResult.setText(strNumbers)

            cursor.close()
            sqlDB.close()
        }
    }

    ...
}

 


[์ฐธ๊ณ ] SQLite GUI ํˆด ํ™œ์šฉ

DB Browser for SQLite์—์„œ DB ๋ฐ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

- [ํŒŒ์ผ]-[์ƒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค]๋ฅผ ์„ ํƒ 

    - [์ €์žฅํ•˜๋ ค๋Š” ํŒŒ์ผ๋ช…์„ ๊ณ ๋ฅด์„ธ์š”] ์ฐฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ์ด ์ €์žฅ๋  ๊ฒฝ๋กœ์™€ ํŒŒ์ผ๋ช…์„ ์ง€์ •ํ•˜๊ณ  ์ €์žฅ

- ํ•„๋“œ(์—ด) ์ถ”๊ฐ€ → ์—ด ์ƒ์„ฑ ํ›„ <OK> ๋ฒ„ํŠผ ํด๋ฆญ

 

DB Browser for SQLite์—์„œ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ 

- [๋ฐ์ดํ„ฐ ๋ณด๊ธฐ] ํƒญ ํด๋ฆญ ํ›„ <์ƒˆ ๋ ˆ์ฝ”๋“œ> ํด๋ฆญํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ž…๋ ฅ

 

์ƒ์„ฑ๋œ DB ํŒŒ์ผ ์‚ฌ์šฉํ•˜๊ธฐ

- Device File Explorer๋ฅผ ์ด์šฉํ•˜์—ฌ ์—…๋กœ๋“œํ•จ

- data>data> com.example.groupapp>databases ํด๋”

 

- DB Browser for SQLite์—์„œ ์ˆ˜์ •ํ•˜์—ฌ ๋‹ค์‹œ Device File Explorer์— ๋ณต์‚ฌํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ(๋‘๊ฐ€์ง€ ํŒŒ์ผ(groupDB, groupDB-journal) ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ์šฐํด๋ฆญ upload, groupDB ์—…๋กœ๋“œ)

 

์ตœ์ข…

package com.example.groupapp

import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast

class MainActivity : AppCompatActivity() {

    lateinit var edtName: EditText
    lateinit var edtNumber: EditText
    lateinit var edtNameResult: EditText
    lateinit var edtNumberResult: EditText
    lateinit var btnInit: Button
    lateinit var btnInsert: Button
    lateinit var btnSelect: Button

    lateinit var myHelper: myDBHelper       // myDBHelper ํด๋ž˜์Šค ๋ณ€์ˆ˜
    lateinit var sqlDB: SQLiteDatabase      // SQLite์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€์ˆ˜

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

        edtName = findViewById(R.id.edtName)
        edtNumber = findViewById(R.id.edtNumber)
        edtNameResult = findViewById(R.id.edtNameResult)
        edtNumberResult = findViewById(R.id.edtNumberResult)

        btnInit = findViewById(R.id.btnInit)
        btnInsert = findViewById(R.id.btnInsert)
        btnSelect = findViewById(R.id.btnSelect)

        myHelper = myDBHelper(this)    // myDBHelper๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด ๋ฐ›์•„์˜ค๊ธฐ

        btnInit.setOnClickListener {
            sqlDB = myHelper.writableDatabase       // myHelper ์ธ์Šคํ„ด์Šค๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด ๋ฐ›์•„์˜ค๊ธฐ
            myHelper.onUpgrade(sqlDB, 1, 2)    // ํ…Œ์ด๋ธ” ๊ฐฑ์‹  (DB์ •๋ณด, ํ˜„์žฌ๋ฒ„์ „, ๋ฐ”๋€”๋ฒ„์ „) (๋ฒ„์ „ ์‚ฌ์šฉํ•œ ์  ์—†์œผ๋ฏ€๋กœ ์•„๋ฌด ์ˆซ์ž ๋„ฃ์–ด๋„ ๋จ ex.100 200)
            sqlDB.close()           // DB ๋‹ซ๊ธฐ
        }

        btnInsert.setOnClickListener {
            sqlDB = myHelper.writableDatabase

            sqlDB.execSQL("INSERT INTO groupTBL VALUES ('" + edtName.text.toString() + "', "
                    + edtNumber.text.toString() + ");")       // sql ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก.. groupTBL: ๋‚ด์šฉ์ด ์‚ฝ์ž…๋  ํ…Œ์ด๋ธ” / VALUES: ๊ฐ’
            sqlDB.close()           // DB ๋‹ซ๊ธฐ
            Toast.makeText(applicationContext, "์ž…๋ ฅ๋จ", Toast.LENGTH_SHORT).show()
        }

        btnSelect.setOnClickListener {
            sqlDB = myHelper.readableDatabase       // ์ฝ๊ธฐ์ „์šฉ์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ

            var cursor: Cursor  // ์ปค์„œ ๋ณ€์ˆ˜ ์ƒ์„ฑ
            cursor = sqlDB.rawQuery("SELECT * FROM groupTBL;", null)       // *: gropTBL์— ์žˆ๋Š” ๋ชจ๋“  colums ๊ฐ€์ ธ์˜ค๊ธฐ, null: ์•ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ธ์ž๊ฐ’์ด ์—†์œผ๋ฏ€๋กœ

            // ๋ ˆ์ฝ”๋“œ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด ์ด๋ฆ„๊ณผ ์ธ์› ๋ช…์‹œ
            var strNames = "๊ทธ๋ฃน์ด๋ฆ„" + "\r\n" + "--------" + "\r\n"
            var strNumbers = "์ธ์›" + "\r\n" + "--------" + "\r\n"

            // while๋ฌธ์„ ํ†ตํ•ด ์ปค์„œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ด๋™์‹œํ‚ค๋ฉฐ ๋ ˆ์ฝ”๋“œ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
            while(cursor.moveToNext()) {
                strNames += cursor.getString(0) + "\r\n"     // ์ปค์„œ 0๋ฒˆ์งธ
                strNumbers += cursor.getString(1) + "\r\n"     // ์ปค์„œ 1๋ฒˆ์งธ
            }

            edtNameResult.setText(strNames)
            edtNumberResult.setText(strNumbers)

            cursor.close()
            sqlDB.close()
        }
    }

    inner class myDBHelper(context: Context) : SQLiteOpenHelper(context, "groupDB", null, 1) {   // inner class: ๋‚ด๋ถ€ ํด๋ž˜์Šค (DB๊ฐ์ฒด ์ƒ์„ฑ ์ •๋ณด, DB๋ช…, ์ปค์„œ๊ฐ’, ๋ฒ„์ „)
        override fun onCreate(db: SQLiteDatabase?) {
            db!!.execSQL("CREATE TABLE groupTBL (gName CHAR(20) PRIMARY KEY, gNumber Integer);")        // CREATE TABLE:ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๋Š” SQL๋ฌธ, groupTBL:๊ทธ๋ฃน๋ช… (์—ด ์ด๋ฆ„ ๊ฐ’)) // ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋กœ ์ž‘์„ฑ(์‹๋ณ„ ํ‚ค)
        }

        override fun onUpgrade(db: SQLiteDatabase?, p1: Int, p2: Int) {
            db!!.execSQL("DROP TABLE IF EXISTS groupTBL")      // ํ…Œ์ด๋ธ” ์‚ญ์ œํ•˜๋Š” SQL๋ฌธ:DROP TABLE, IF EXISTS:ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•  ๋•Œ๋งŒ ์‚ญ์ œ
            onCreate(db)    // ์ƒ์„ฑํ•  ๋• onCreat() ํ˜ธ์ถœ
        }
    }
}

 

 

 

์ •๋ฆฌ

- SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์— ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

    - ํ‘œ์ค€ SQL ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ

- SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด SQLiteOpenHelperํด๋ž˜์Šค, SQLiteDatabase ํด๋ž˜์Šค, Cursor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•จ

 


ํ”„๋กœ์ ํŠธ ์‘์šฉ

<์ˆ˜์ •>๊ณผ <์‚ญ์ œ> ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ - ํžŒํŠธ

- ์ˆ˜์ • SQL: UPDATE groupTBL SET gNumber = ๋ณ€๊ฒฝ๋œ ์ธ์› WHERE gName=“๋ณ€๊ฒฝํ•  ๊ทธ๋ฃน ์ด๋ฆ„“;

- ์‚ญ์ œ SQL: DELETE FROM groupTBL SET gName = “์‚ญ์ œํ•  ๊ทธ๋ฃน ์ด๋ฆ„“;

- ์ž…๋ ฅ/์ˆ˜์ •/์‚ญ์ œ ํ›„ ์ฆ‰์‹œ ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์ด๊ฒŒ ํ•˜๋ ค๋ฉด (๋ฒ„ํŠผ๋ณ€์ˆ˜).callOnClick()์„ ํ˜ธ์ถœ

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="์ด๋ฆ„ : "
            android:textSize="20dp" />

        <EditText
            android:id="@+id/edtName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="์ธ์› : "
            android:textSize="20dp" />

        <EditText
            android:id="@+id/edtNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btnInit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="์ดˆ๊ธฐํ™”"
            android:textSize="12sp" />

        <Button
            android:id="@+id/btnInsert"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="์ž…๋ ฅ" />

        <Button
            android:id="@+id/btnUpdate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="์ˆ˜์ •" />

        <Button
            android:id="@+id/btnDelete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="์‚ญ์ œ" />

        <Button
            android:id="@+id/btnSelect"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="์กฐํšŒ" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="8"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/edtNameResult"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="#DDDDFC"
            android:padding="20dp"
            android:layout_weight="1" />

        <EditText
            android:id="@+id/edtNumberResult"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="#DDDDFC"
            android:padding="20dp"
            android:layout_weight="1" />

    </LinearLayout>

</LinearLayout>

 

package com.example.groupapp

import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast

class MainActivity : AppCompatActivity() {

    lateinit var edtName: EditText
    lateinit var edtNumber: EditText
    lateinit var edtNameResult: EditText
    lateinit var edtNumberResult: EditText
    lateinit var btnInit: Button
    lateinit var btnInsert: Button
    lateinit var btnSelect: Button
    lateinit var btnUpdate: Button
    lateinit var btnDelete: Button

    lateinit var myHelper: myDBHelper       // myDBHelper ํด๋ž˜์Šค ๋ณ€์ˆ˜
    lateinit var sqlDB: SQLiteDatabase      // SQLite์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€์ˆ˜

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

        edtName = findViewById(R.id.edtName)
        edtNumber = findViewById(R.id.edtNumber)
        edtNameResult = findViewById(R.id.edtNameResult)
        edtNumberResult = findViewById(R.id.edtNumberResult)

        btnInit = findViewById(R.id.btnInit)
        btnInsert = findViewById(R.id.btnInsert)
        btnSelect = findViewById(R.id.btnSelect)
        btnUpdate = findViewById(R.id.btnUpdate)
        btnDelete = findViewById(R.id.btnDelete)

        myHelper = myDBHelper(this)    // myDBHelper๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด ๋ฐ›์•„์˜ค๊ธฐ

        btnInit.setOnClickListener {
            sqlDB = myHelper.writableDatabase       // myHelper ์ธ์Šคํ„ด์Šค๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด ๋ฐ›์•„์˜ค๊ธฐ
            myHelper.onUpgrade(sqlDB, 1, 2)    // ํ…Œ์ด๋ธ” ๊ฐฑ์‹  (DB์ •๋ณด, ํ˜„์žฌ๋ฒ„์ „, ๋ฐ”๋€”๋ฒ„์ „) (๋ฒ„์ „ ์‚ฌ์šฉํ•œ ์  ์—†์œผ๋ฏ€๋กœ ์•„๋ฌด ์ˆซ์ž ๋„ฃ์–ด๋„ ๋จ ex.100 200)
            sqlDB.close()           // DB ๋‹ซ๊ธฐ
        }

        btnInsert.setOnClickListener {
            sqlDB = myHelper.writableDatabase

            sqlDB.execSQL("INSERT INTO groupTBL VALUES ('" + edtName.text.toString() + "', "
                    + edtNumber.text.toString() + ");")       // sql ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก.. groupTBL: ๋‚ด์šฉ์ด ์‚ฝ์ž…๋  ํ…Œ์ด๋ธ” / VALUES: ๊ฐ’
            sqlDB.close()           // DB ๋‹ซ๊ธฐ

            Toast.makeText(applicationContext, "์ž…๋ ฅ๋จ", Toast.LENGTH_SHORT).show()
            btnSelect.callOnClick()     // ์กฐํšŒ ๊ฐ•์ œ ๋ฐœ์ƒ
        }

        btnSelect.setOnClickListener {
            sqlDB = myHelper.readableDatabase       // ์ฝ๊ธฐ์ „์šฉ์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ

            var cursor: Cursor  // ์ปค์„œ ๋ณ€์ˆ˜ ์ƒ์„ฑ
            cursor = sqlDB.rawQuery("SELECT * FROM groupTBL;", null)       // *: gropTBL์— ์žˆ๋Š” ๋ชจ๋“  colums ๊ฐ€์ ธ์˜ค๊ธฐ, null: ์•ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ธ์ž๊ฐ’์ด ์—†์œผ๋ฏ€๋กœ

            // ๋ ˆ์ฝ”๋“œ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด ์ด๋ฆ„๊ณผ ์ธ์› ๋ช…์‹œ
            var strNames = "๊ทธ๋ฃน์ด๋ฆ„" + "\r\n" + "--------" + "\r\n"
            var strNumbers = "์ธ์›" + "\r\n" + "--------" + "\r\n"

            // while๋ฌธ์„ ํ†ตํ•ด ์ปค์„œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ด๋™์‹œํ‚ค๋ฉฐ ๋ ˆ์ฝ”๋“œ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
            while(cursor.moveToNext()) {
                strNames += cursor.getString(0) + "\r\n"     // ์ปค์„œ 0๋ฒˆ์งธ
                strNumbers += cursor.getString(1) + "\r\n"     // ์ปค์„œ 1๋ฒˆ์งธ
            }

            edtNameResult.setText(strNames)
            edtNumberResult.setText(strNumbers)

            cursor.close()
            sqlDB.close()
        }

        btnUpdate.setOnClickListener {
            sqlDB = myHelper.writableDatabase       // ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ ์“ฐ๊ธฐ ์ „์šฉ

            sqlDB.execSQL("UPDATE groupTbL SET gNumber = " + edtNumber.text + " WHERE gName = '"
                    + edtName.text.toString() + "';")       // (์ˆ˜์ •๋ฌธ, ๋ญ๊ฐ€ ๋ฐ”๋€” ๊ฒƒ์ธ์ง€(์ธ์› ๋ฐ”๋€” ๊ฒƒ์ž„), ์กฐ๊ฑด๋ฌธ(๋ฐ”๋€” ์ธ์›์˜ ์ด๋ฆ„์ด ์ž…๋ ฅํ•œ ์ด๋ฆ„๊ณผ ๊ฐ™์€์ง€))

            sqlDB.close()

            Toast.makeText(applicationContext, "์ˆ˜์ •๋จ", Toast.LENGTH_SHORT).show()
            btnSelect.callOnClick()     // ์กฐํšŒ ๊ฐ•์ œ ๋ฐœ์ƒ
        }

        btnDelete.setOnClickListener {
            sqlDB = myHelper.writableDatabase       // ์‚ญ์ œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์“ฐ๊ธฐ ์ „์šฉ

            sqlDB.execSQL("DELETE FROM groupTBL WHERE gName = '" + edtName.text.toString() + "';")   // edtName๊ณผ gName์ด ๊ฐ™์„ ๋•Œ groupTBL์—์„œ ์‚ญ์ œ

            sqlDB.close()

            Toast.makeText(applicationContext, "์‚ญ์ œ๋จ", Toast.LENGTH_SHORT).show()
            btnSelect.callOnClick()     // ์กฐํšŒ ๊ฐ•์ œ ๋ฐœ์ƒ
        }
    }

    inner class myDBHelper(context: Context) : SQLiteOpenHelper(context, "groupDB", null, 1) {   // inner class: ๋‚ด๋ถ€ ํด๋ž˜์Šค (DB๊ฐ์ฒด ์ƒ์„ฑ ์ •๋ณด, DB๋ช…, ์ปค์„œ๊ฐ’, ๋ฒ„์ „)
        override fun onCreate(db: SQLiteDatabase?) {
            db!!.execSQL("CREATE TABLE groupTBL (gName CHAR(20) PRIMARY KEY, gNumber Integer);")        // CREATE TABLE:ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๋Š” SQL๋ฌธ, groupTBL:๊ทธ๋ฃน๋ช… (์—ด ์ด๋ฆ„ ๊ฐ’)) // ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋กœ ์ž‘์„ฑ(์‹๋ณ„ ํ‚ค)
        }

        override fun onUpgrade(db: SQLiteDatabase?, p1: Int, p2: Int) {
            db!!.execSQL("DROP TABLE IF EXISTS groupTBL")      // ํ…Œ์ด๋ธ” ์‚ญ์ œํ•˜๋Š” SQL๋ฌธ:DROP TABLE, IF EXISTS:ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•  ๋•Œ๋งŒ ์‚ญ์ œ
            onCreate(db)    // ์ƒ์„ฑํ•  ๋• onCreat() ํ˜ธ์ถœ
        }
    }
}