π‘ μ°μνν ν¬μ½μ€ νλ μ€μ μ¬μ©ν SQLiteμ λνμ¬ νμ΅νμμ΅λλ€ !
SQLite
- SQLiteλ λ°μ΄ν°λ² μ΄μ€ κ΄λ¦¬ μμ€ν μΌλ‘ μλ²κ° μλ μμ© νλ‘κ·Έλ¨μ λ£μ΄ μ¬μ©νλ κ°λ²Όμ΄ λ°μ΄ν°λ² μ΄μ€μ λλ€.
- λ‘컬 λ°μ΄ν°λ₯Ό κ΄λ¦¬ν΄μΌ νλ λ€μν μ ν리μΌμ΄μ
μμ μ¬μ©λλ©°, μλμ κ°μ μμμ μ£Όλ‘ νμ©λ©λλ€ !
- μ¬μ©μ μ€μ μ 보
- μ¦κ²¨μ°ΎκΈ°
- μΊμ λ°μ΄ν°
- μ¬μ©μμ μ€νλΌμΈ μμ± λ°μ΄ν°
- μλλ‘μ΄λμ λ΄μ₯λμ΄ μμΌλ©°, μ΄νμ΄ μ’ λ£λκ±°λ λλ°μ΄μ€ μ μμ΄ κΊΌμ§λλΌλ μμ λμ§ μμ΅λλ€.
DBConstant
- SQLite λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©ν λ, λ°μ΄ν°λ² μ΄μ€ κ΄λ ¨ μμλ€μ μ μνλ μν μ νλ Constantμ λλ€.
- μ£Όμ μ½λμ κ°λ μ±μ λμ΄κ³ , μ€μλ₯Ό λ°©μ§νλ©΄μ μ½κ² μ°Έμ‘°ν μ μλλ‘ νκΈ° μν΄ μ¬μ©ν©λλ€.
- μλλ μ°μνν ν¬μ½μ€ νλ μ€μ μ μΈν μ€λͺ© λ°μ΄ν°λ² μ΄μ€λ₯Ό μν Constant μ λλ€.
object OmockDBConstant {
const val X_COORDINATE = "x_column"
const val Y_COORDINATE = "y_row"
const val TABLE_NAME = "omok_coordinates"
}
- κ° μ€λͺ©μ λν x,y μ’νλ₯Ό μ μ₯νκΈ° μν μμμ ν μ΄λΈ μμ±μ μν ν μ΄λΈ λͺ μ μ μΈνμμ΅λλ€.
SQLiteOpenHelper
- SQLiteOpenHelperλ₯Ό μμνμ¬ λ°μ΄ν°λ² μ΄μ€ μμ±, μ κ·Έλ μ΄λ λ° κ΄λ¦¬λ₯Ό μνν μ μμ΅λλ€.
- μλ λ κ°μ§ λ©μλλ₯Ό μ€λ²λΌμ΄λ ν©λλ€.
- onCreate() : λ°μ΄ν°λ² μ΄μ€κ° μ²μ μμ± λ λ νΈμΆλ©λλ€.
- onUpgrade() : λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§κ° λ³κ²½λ λ νΈμΆλ©λλ€.
class DBHelper(context: Context) :
SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
override fun onCreate(db: SQLiteDatabase?) {
val createTableQuery =
"CREATE TABLE omok_coordinates (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"${OmockDBConstant.X_COORDINATE} INTEGER," +
"${OmockDBConstant.Y_COORDINATE} INTEGER" +
");"
db?.execSQL(createTableQuery)
}
override fun onUpgrade(
db: SQLiteDatabase?,
oldVersion: Int,
newVersion: Int,
) {
db?.execSQL("DROP TABLE IF EXISTS omok_coordinates")
onCreate(db)
}
companion object {
private const val DATABASE_NAME = "omok.db"
private const val DATABASE_VERSION = 4
}
}
- onCreate() μμ ν
μ΄λΈ 쿼리λ₯Ό μμ±νκ³ , execSQLμ νμ©νμ¬ SQL 쿼리λ₯Ό μ€νν©λλ€.
- ν μ΄λΈ 쿼리 μμ± μ κ³ μ id(PRIMARY KEY)μ μμλ‘ μ μΈν x,y μ’νλ₯Ό Int κ°μΌλ‘ μ μΈνμμ΅λλ€.
DAO
- DAOλ Data Access Objectμ μ½μλ‘ λ°μ΄ν°λ² μ΄μ€μ dataμ μ κ·ΌνκΈ° μν κ°μ²΄μ λλ€.
- DBμ μ κ·ΌνκΈ° μν λ‘μ§μ λΆλ¦¬νκΈ° μν΄ μ¬μ©νμμ΅λλ€.
- DAOμ μ΄ 3κ°μ§ λ©μλλ₯Ό μ μΈνμμ΅λλ€.
- 쿼리μ λν μ κ·Όλ§ νμ©νλ κ²½μ° DBλ₯Ό readableDatabaseλ‘ μμ±ν©λλ€.
- 쿼리μ λν μμ , μμ , μΆκ°κ° μ΄λ£¨μ΄μ§λ κ²½μ° writableDatabaseλ‘ μμ±ν©λλ€.
class OmokDAO(context: Context) {
private val dbHelper = DBHelper(context)
....
companion object {
private const val DATABASE_NAME = "omok.db"
private const val DATABASE_VERSION = 4
}
}
Insert
- insertCoordinate(x,y) : x,y μ’νλ₯Ό λ°μμ dbμ μ μ₯νλ λ©μλμ λλ€.
fun insertCoordinate(
x: Int,
y: Int,
) {
val db = dbHelper.writableDatabase
val values =
ContentValues().apply {
put(OmockDBConstant.X_COORDINATE, x)
put(OmockDBConstant.Y_COORDINATE, y)
}
db.insert(OmockDBConstant.TABLE_NAME, null, values)
db.close()
}
Select
- getAllCoordinates() : DBμ μ μ₯ λ λͺ¨λ x,y μ’νλ₯Ό λΆλ¬μ€λ λ©μλμ
λλ€.
- 컀μλ₯Ό μ¬μ©νμ¬ λͺ¨λ λ°μ΄ν°λ₯Ό μ½μ΄μ¬ λκΉμ§ λ°λ³΅ν©λλ€.
fun getAllCoordinates(): List<Pair<Int, Int>> {
val db = dbHelper.readableDatabase
val cursor: Cursor =
db.rawQuery(
"SELECT ${OmockDBConstant.X_COORDINATE},${OmockDBConstant.Y_COORDINATE} FROM omok_coordinates",
null,
)
val coordinates = mutableListOf<Pair<Int, Int>>()
with(cursor) {
while (moveToNext()) {
val column = getInt(getColumnIndexOrThrow(OmockDBConstant.X_COORDINATE))
val row = getInt(getColumnIndexOrThrow(OmockDBConstant.Y_COORDINATE))
coordinates.add(Pair(column, row))
}
}
cursor.close()
db.close()
return coordinates
}
Delete
- resetAllCoordinates() : λͺ¨λ μ’νλ₯Ό μ κ±°νλ λ©μλμ λλ€.
fun resetAllCoordinates() {
val db = dbHelper.writableDatabase
db.delete(OmockDBConstant.TABLE_NAME, null, null)
db.close()
}
Activityμμ DAO μ κ·Ό
- μ΄μ μμ±ν DAOλ₯Ό μ‘ν°λΉν°μμ μμ±ν΄μ μ¬μ©ν μ μμ΅λλ€.
private val dao = OmokDAO(this@MainActivity)
- μμ²λΌ μ μΈνμ¬ μ¬μ©ν μ μμΌλ©°, DAOμ μμ±ν 쿼리λ₯Ό μ€ννλ ν¨μλ‘ κ°λ¨νκ² μ¬μ©ν μ μμ΅λλ€.
//insert
dao.insertCoordinate(columIndex, rowIndex)
//select
dao.getAllCoordinates().forEach { (columnIndex, rowIndex) -> }
//delete
dao.resetAllCoordinates()
μ 리
- SQLiteλ μ ν리μΌμ΄μ λ΄μμ μλ²μ μ°κ²° μμ΄ λ°μ΄ν°λ₯Ό λ‘컬μ μꡬ μ μ₯ν΄μΌ νλ κ²½μ° μ μ©νκ² μ¬μ©ν μ μμ΅λλ€.
- κ²½λν λ°μ΄ν°λ² μ΄μ€ κ΄λ¦¬ μμ€ν μΌλ‘ κ°νΈνκ² μ¬μ©ν μ μλ€λ μ₯μ μ΄ μμ΅λλ€.
- λ¨μ μΌλ‘λ λμμ± λ³΄μ₯κ³Ό λκ·λͺ¨ λ°μ΄ν° μ²λ¦¬μ λΆμ ν©νλ€λ κ²μ
λλ€.
- λμμ μ°κΈ° μμ μ μ²λ¦¬νλ λ° μ μ½μ΄ μμ
- λ€μμ μ°κΈ° μμ μ ν΅ν μ±λ₯ μ νκ° μμ
- λκ·λͺ¨ μ ν리μΌμ΄μ μλ ν¨μ¨μ μ΄μ§ μμ