๐ก ๊ฐ๋จํ ๋ฉ๋ชจ๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฉํ๋ ํ๋ก์ ํธ
์ด ํ๋ก์ ํธ์์ ๋ฉ๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฉํ ํ ์ด๋ธ์ ๋ค์์ฒ๋ผ ์ค๊ณ
CREATE TABLE memo (
num INTEGER PRIMARY KEY,
content TEXT,
datetime INTEGER
)
- SQLite ์์๋ INTEGER ํ์ ์ด primary key ์ด๋ฉด ์ซ์๊ฐ ์๋ ์ฆ๊ฐ๋จ
1. SQLiteOpenHelper ์ฌ์ฉํ๊ธฐ
๐พ SQLiteOpenHelper ํด๋์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ผ๋ก ์์ฑํ๊ณ ์ฝํ๋ฆฐ ์ฝ๋์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๋ ์ญํ
1) ํ๋ก์ ํธ ์์ฑ ํ [app] - [java] ๋๋ ํ ๋ฆฌ ๋ฐ์ ์๋ ํจํค์ง์ SQLiteHelper ํด๋์ค๋ฅผ ์์ฑ
2) ํด๋์ค ์ ์ ๋ฐ ์์ฑ์
- SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด SQLiteOpenHelper ํด๋์ค๋ฅผ ์์๋ฐ์์ผ ํจ
- SQLiteOpenHelper๋ ์์ฑ ์์ Context, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช , ํฉํ ๋ฆฌ, ๋ฒ์ ์ ๋ณด๊ฐ ํ์. ํฉํ ๋ฆฌ๋ ์ฌ์ฉํ์ง ์์๋ ๋๋ฏ๋ก ๋๋จธ์ง ์ธ ๊ฐ์ง ์ ๋ณด๋ฅผ ๋ด๊ฐ ๋ง๋ ํด๋์ค์ ์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ์ํ ํ์ ์์๋ฐ์ SQLiteOpenHelper์ ์ ๋ฌ.
class SQLiteHelper(context: Context, name: String, version: Int):
SQLiteOpenHelper(context, name, null, version) {
3) SQLiteOpenHelper ๋ฉ์๋๋ฅผ ๊ตฌํ
class SQLiteHelper(context: Context, name: String, version: Int):
SQLiteOpenHelper(context, name, null, version) {
override fun onCreate(p0: SQLiteDatabase?) {
// ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ฒ์ ์์ฑ๋ ๋ ํธ์ถ
}
override fun onUpgrade(p0: SQLiteDatabase?, p1: Int, p2: Int) {
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์
๊ทธ๋ ์ด๋ ์ ํธ์ถ
}
4) ์์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ฑ๋์ง ์์๊ธฐ ๋๋ฌธ์ onCreate() ๋ฉ์๋์์ ํ ์ด๋ธ์ ์์ฑ
- ์ด ๋ฉ์๋ ์์ ํ ์ด๋ธ ์์ฑ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์คํ. ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ฑ๋์ด ์์ผ๋ฉด ๋ ์ด์ ์คํ๋์ง ์์. onCreate() ๋ฉ์๋ ์์ ์์์ ๋ง๋ ํ ์ด๋ธ ์์ฑ ์ฟผ๋ฆฌ๋ฅผ ๋ฌธ์์ด๋ก ์ ๋ ฅํ ํ, db์ execSQL() ๋ฉ์๋์ ์ ๋ฌํด์ ์คํ
override fun onCreate(p0: SQLiteDatabase?) {
val sql = "CREATE TABLE `memo` (`num` INTEGER PRIMARY KEY," +
"`content` TEXT, `datetime` INTEGER)"
p0?.execSQL(sql)
}
5) Memo ๋ฐ์ดํฐ ํด๋์ค
- SQLiteHelper ํด๋์ค์ ๋ฐ๊นฅ์ Memo ํด๋์ค๋ฅผ ํ๋ ์์ฑํ๊ณ ์ ์
โก๏ธ ์ด ํด๋์ค๋ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ์ฌ ๋ฉ๋ชจ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ธฐ๋ณธ์ ์ธ CRUD(์์ฑ, ์ฝ๊ธฐ, ์ ๋ฐ์ดํธ, ์ญ์ ) ์์ ์ ์ํํ ์ ์๋๋ก ํจ
data class Memo(var num: Long?, var content: String, var datetime: Long)
num๊ณผ datetime์ ํ์
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ INTEGER๋ก ์ ์ํ๋๋ฐ, ์ฌ๊ธฐ์๋ Long. ์ซ์์ ๋ฒ์๊ฐ ์๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ.
ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด SQLite์์ INTEGER๋ก ์ ์ธํ ๊ฒ์ ์์ค ์ฝ๋์์๋ Long์ผ๋ก ์ฌ์ฉ.
๊ทธ๋ฆฌ๊ณ num๋ง null์ ํ์ฉํ ๊ฒ์ PRIMARY KEY ์ต์
์ผ๋ก ๊ฐ์ด ์๋์ผ๋ก ์ฆ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ฝ์
์์๋ ํ์ํ์ง ์์.
2. ์ฝ์ ๋ฉ์๋
1) SQLiteOpenHelper๋ฅผ ์ด์ฉํด์ ๊ฐ์ ์ ๋ ฅํ ๋๋ ์ฝํ๋ฆฐ์ Map ํด๋์ค์ฒ๋ผ ํค, ๊ฐ ํํ๋ก ์ฌ์ฉ๋๋ ContentValues ํด๋์ค๋ฅผ ์ฌ์ฉ
๐พ ContentValues์ put("์ปฌ๋ผ๋ช ", ๊ฐ)์ผ๋ก ์ ์ฅ
fun insertMemo(memo: Memo) {
val value = ContentValues()
value.put("content", memo.content)
value.put("datetime", memo.datetime)
}
2) ์์๋ฐ์ SQLiteOpenHelper์ ์ด๋ฏธ ๊ตฌํ๋ writableDatabase์ ํ ์ด๋ธ๋ช ๊ณผ ํจ๊ป ์์์ ์์ฑํ ๊ฐ์ ์ ๋ฌํด์ insert()ํ๊ณ , ์ฌ์ฉํ ํ์๋ close()๋ฅผ ํธ์ถํ์ฌ ๊ผญ ๋ซ์์ค์ผ ํจ
fun insertMemo(memo: Memo) {
val value = ContentValues()
value.put("content", memo.content)
value.put("datetime", memo.datetime)
writableDatabase.insert("memo", null, value)
writableDatabase.close()
}
- ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ : ํ ์ด๋ธ ์ด๋ฆ / ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ : ๊ฐ์ด null ์ผ ๋ ์ ๋ ฅ ๋ฐฉ์ง / ์ธ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ : ์ฝ์ ํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ContentValues ๊ฐ์ฒด
3. ์กฐํ ๋ฉ์๋
1) ์กฐํ ๋ฉ์๋๋ ๋ฐํ๊ฐ์ด ์์ผ๋ฏ๋ก ๋ฉ์๋์ ๊ฐ์ฅ ์์ค์ ๋ฐํํ ๊ฐ์ ๋ณ์๋ก ์ ์ธํ๊ณ , ๊ฐ์ฅ ์๋ซ์ค์ ๋ฐํํ๋ ์ฝ๋๋ฅผ ์์ฑํ ํ ๊ทธ ์ฌ์ด์ ๊ตฌํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์
fun selectMemo(): MutableList<Memo> {
val list = mutableListOf<Memo>()
return list
}
2) ๋ฉ๋ชจ์ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑ
val sql = "SELECT * FROM memo"
3) ์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ์์ ๋ด์
val rd = readableDatabase
4) ๋ฐ์ดํฐ๋ฒ ์ด์ค์ rawQuery() ๋ฉ์๋์ ์์์ ์์ฑํด๋ ์ฟผ๋ฆฌ๋ฅผ ๋ด์์ ์คํํ๋ฉด ์ปค์ cursor ํํ๋ก ๋ฐํ
val cursor = rd.rawQuery(sql, null)
์ปค์ Cursor
๋ฐ์ดํฐ์
์ ์ฒ๋ฆฌํ ๋ ํ์ฌ ์์น๋ฅผ ํฌํจํ๋ ๋ฐ์ดํฐ ์์. ์ปค์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ๋ฅผ ํตํด ๋ฐํ๋ ๋ฐ์ดํฐ์
์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ฐ๋ณตํ๋ฉฐ ํ๋์ฉ ์ฒ
๋ฆฌํ ์ ์์. ๋ฐ๋ณตํ ๋๋ง๋ค ์ปค์๊ฐ ํ์ฌ ์์น๋ฅผ ๊ฐ๋ฅดํค๊ณ ์์ด [๋ฐ์ดํฐ ์ฝ๊ธฐ -> ๋ค์ ์ค ์ด๋]์ ๋จ์ ๋ก์ง์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์.
5) ์ปค์์ moveToNext() ๋ฉ์๋๊ฐ ์คํ๋๋ฉด ๋ค์ ์ค์ ์ฌ์ฉํ ์์๋ ๋ ์ฝ๋๊ฐ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํํ๊ณ , ํด๋น ์ปค์๋ฅผ ๋ค์ ์์น๋ก ์ด๋. ๋ ์ฝ๋๊ฐ ์์ผ๋ฉด ๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ๋๊ฐ. ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ฝ์ ๋๊น์ง ๋ฐ๋ณต.
while(cursor.moveToNext()) { }
6) ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ ํ ์ด๋ธ์ ์ ์๋ 3๊ฐ์ ์ปฌ๋ผ์์ ๊ฐ์ ๊บผ๋ธ ํ ๊ฐ๊ฐ ๋ณ์์ ๋ด์
val num = cursor.getLong(0)
val content = cursor.getString(1)
val datetime = cursor.getLong(2)
7) ์์์ ๋ณ์์ ์ ์ฅํด๋์๋ ๊ฐ๋ค๋ก Memo ํด๋์ค๋ฅผ ์์ฑํ๊ณ ๋ฐํํ ๋ชฉ๋ก์ ๋ํจ
list.add(Memo(num, content, datetime))
8) while ๋ฌธ์ ๋ธ๋ก ๋ฐ์์ ์ปค์์ ์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ชจ๋ ๋ซ์ ์ค
cursor.close()
rd.close()
fun selectMemo(): MutableList<Memo> {
val list = mutableListOf<Memo>()
val sql = "SELECT * FROM memo"
val rd = readableDatabase
val cursor = rd.rawQuery(sql, null)
while(cursor.moveToNext()) {
val num = cursor.getLong(0)
val content = cursor.getString(1)
val datetime = cursor.getLong(2)
list.add(Memo(num, content, datetime))
}
cursor.close()
rd.close()
return list
}
4. ์์ ๋ฉ์๋
1) INSERT์ ๋์ผํ๊ฒ ContentValues๋ฅผ ์ฌ์ฉํด์ ์์ ํ ๊ฐ์ ์ ์ฅ
fun updateMemo(memo: Memo) {
val values = ContentValues()
values.put("content", memo.content)
values.put("datetime", memo.datetime)
}
2) writableDatabase์ update() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ๋ค์ close()๋ฅผ ํธ์ถ
update() ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ ์ด 4๊ฐ์ธ๋ฐ (ํ
์ด๋ธ๋ช
, ์์ ํ ๊ฐ, ์์ ํ ์กฐ๊ฑด)
์์ ํ ์กฐ๊ฑด์ PRIMARY KEY๋ก ์ง์ ๋ ์ปฌ๋ผ์ ์ฌ์ฉํ๋ฉฐ ์ฌ๊ธฐ์์๋ PRIMARY KEY์ธ ์ปฌ๋ผ์ด num์ด๊ธฐ ๋๋ฌธ์ 'num = ์ซ์'๊ฐ ๋จ.
์ธ ๋ฒ์งธ ๊ฐ์ 'num = ?'์ ํํ๋ก ์
๋ ฅํ๊ณ , ๋ค ๋ฒ์งธ ?์ ๋งคํํ ๊ฐ์ arrayOf("${memo.num}")์ ํํ๋ก ์ ๋ฌํ ์๋ ์์. ์ฌ๊ธฐ์๋ ์ธ ๋ฒ์งธ์ ์กฐ๊ฑด๊ณผ ๊ฐ์ ๋ชจ๋ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๋ค ๋ฒ์งธ์ null์ ์ฌ์ฉ
fun updateMemo(memo: Memo) {
val values = ContentValues()
values.put("content", memo.content)
values.put("datetime", memo.datetime)
val wd = writableDatabase
wd.update("memo", values, "num = ${memo.num}", null)
wd.close()
}
5. ์ญ์ ๋ฉ์๋
SQLiteOpenHelper ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด insert(), update() ๋ฉ์๋์ ์ฌ์ฉ๋ฒ๋ง ์๋ฉด ์ฟผ๋ฆฌ๋ฅผ ๋ชฐ๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์์. ํ์ง๋ง ๋ณต์กํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃฐ ๋๋ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ ์ ๋ฐํ๊ฒ ๋ค๋ฃฐ ์ ์์ผ๋ฏ๋ก ์ฟผ๋ฆฌ๋ฅผ ๊ณต๋ถํ๋ ๊ฒ์ด ์ค์. ์ญ์ ๋ฉ์๋ (DELETE)๋ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ ๋ ฅํด์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ์ฝ๋๋ก ์์ฑ.
1) ๋ฐ์ดํฐ ์ญ์ ๋ฉ์๋๋ฅผ ์์ฑ
- ์กฐ๊ฑด์์ '์ปฌ๋ผ๋ช = ๊ฐ'์ ํํ๊ฐ ๋จ. ์ญ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ๋ณ์์ ์ ์ฅ
fun deleteMemo(memo: Memo) {
val sql = "DELETE FROM memo WHERE num=${memo.num}"
}
2) writableDatabase์ execSQL() ๋ฉ์๋๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํ ํ close()๋ฅผ ํธ์ถ. execSQL() ๋ฉ์๋๋ก ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์คํํ ์ ์์
fun deleteMemo(memo: Memo) {
val sql = "DELETE FROM memo WHERE num=${memo.num}"
val wd = writableDatabase
wd.execSQL(sql)
wd.close()
}
[ ๋ด์ฉ ์ฐธ๊ณ : IT ํ์ ๊ฐ์ ]
'Android Studio' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android Studio] Room: ORM ๋ผ์ด๋ธ๋ฌ๋ฆฌ (0) | 2024.05.23 |
---|---|
[Android Studio] SQLite ์์ (2) ํ๋ฉด์ ๋ง๋ค๊ณ ์์ค ์ฝ๋ ์ฐ๊ฒฐ (1) | 2024.05.23 |
[Android Studio] ๊ตฌ๊ธ ์ง๋ (0) | 2024.05.17 |
[Android Studio] SQLite (1) | 2024.05.16 |
[Android Studio] ์กํฐ๋นํฐ์ ์ธํ ํธ์ ์์ฉ (0) | 2024.05.12 |