728x90
반응형
검색 기록을 만들 일이 있어서 코틀린으로 sqlite를 쓸 일이 생겼다.
일단 코드부터 보면
package com.connple.weat.sqlite
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import android.provider.BaseColumns
// sql 헬퍼 생성
class SearchSQLiteHelper(context: Context) :
SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL(SQL_CREATE_ENTRIES)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
db.execSQL(SQL_DELETE_ENTRIES)
onCreate(db)
}
override fun onDowngrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
onUpgrade(db, oldVersion, newVersion)
}
companion object {
// If you change the database schema, you must increment the database version.
const val DATABASE_VERSION = 1
const val DATABASE_NAME = "SearchTable.db"
}
}
// 테이블 생성 엔트리
private const val SQL_CREATE_ENTRIES =
"CREATE TABLE ${SearchTable.SearchEntry.TABLE_NAME} (" +
"${BaseColumns._ID} INTEGER PRIMARY KEY," +
"${SearchTable.SearchEntry.COLUMN_NAME_STORE} TEXT UNIQUE NOT NULL," +
"${SearchTable.SearchEntry.COLUMN_NAME_MENU} TEXT," +
"${SearchTable.SearchEntry.COLUMN_NAME_TIME} DATETIME)"
// 테이블 제거 엔트리
private const val SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS ${SearchTable.SearchEntry.TABLE_NAME}"
// 테이블 스키마
object SearchTable {
// Table contents are grouped together in an anonymous object.
object SearchEntry : BaseColumns {
const val TABLE_NAME = "search"
const val COLUMN_NAME_STORE = "store"
const val COLUMN_NAME_MENU = "menu"
const val COLUMN_NAME_TIME = "time"
}
}
SQLiteOpenHelper를 상속 받은 SearchSQLiteHelper 클래스를 생성한다.
db.execSQL()은 디비에 sql를 실행시키는 함수이고 여기에 걸맞는 문자열을 조립해서 넣게 된다.
object로 테이블 스키마를 설정하게 되고 여기서 테이블에서 사용할 상수값을 정한다.
class WriteSearchSQLite() {
// 검색 기록 DTO
data class HistoryDTO(
var id: Long,
var store: String,
var menu: String
)
// 데이터 삽입 함수
fun insertSearch(context: Context, store:String, menu:String) {
// SQLiteHelper 설정
val database = SearchSQLiteHelper(context = context)
// 디비 읽을 수 있게 설정
val db = database.writableDatabase
val searchEntry = SearchTable.SearchEntry
// 디비에 삽입할 값 설정
val values = ContentValues().apply {
put(searchEntry.COLUMN_NAME_STORE, store)
try {
put(searchEntry.COLUMN_NAME_MENU, menu)
} catch (e: Exception) {
put(searchEntry.COLUMN_NAME_MENU, "메뉴 없음")
}
}
// 시간 순 정렬
val sortOrder = "'time' DESC"
val cursor = db.query(
searchEntry.TABLE_NAME,// 테이블 네임
null, // 컬럼 배열(null이면 모두 해당)
null, // where 절 컬럼 (where column = ?)
null, // where 절 값 (where column = value)
null,
null,
sortOrder
)
val itemArrays = arrayListOf<HistoryDTO>()
var next = 0
with(cursor)
{
//cursor에서 읽어들이는 값이 null일 때 까지
while (moveToNext() && next < 20) {
next++
val id = getLong(0)
val store = getString(1)
val menu = getString(2)
val item: HistoryDTO = HistoryDTO(
id,
store,
menu
)
// 아이템 더하기
itemArrays.add(item)
}
}
// 삽입된 값 출력
for (i in itemArrays) println("i: $i")
// 커서 종료
cursor.close()
}
fun loadHistory() {
val database = SearchSQLiteHelper(applicationContext)
val db = database.readableDatabase
val cursor = db.query(
SearchTable.SearchEntry.TABLE_NAME,
null,
null,
null,
null,
null,
"time DESC"
)
// HistoryDTO에 값 저장
with(cursor) {
while (moveToNext()) {
val id = getLong(0) // 각 칼럼에 인덱스를 두고 인덱스 순으로 값을 불러옴
val store = getString(1)
val menu = getString(2)
history.add(HistoryDTO(id, store, menu))
}
}
var t = 0
for (i in history) {
println("검색 기록 $t")
t++
}
cursor.close()
}
}
디비에 값을 삽입하고, 불러오는 함수와 클래스이다.
728x90
반응형
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 null 처리 - ? ?. ?: !!, let, lateinit, 제너릭, 플랫폼 타입 category (0) | 2024.04.04 |
---|---|
[Kotlin] 문법 정리 (1) | 2024.04.04 |
코틀린에서 권한 요청 하는 함수 (0) | 2020.07.16 |
코틀린에서 API KeyHash 생성하는 함수 (0) | 2020.07.13 |
[안드로이드]CLEARTEXT communication to XXXX not permitted by network security policy 에러 해결 방법 (0) | 2020.07.09 |