웹에서는 클라이언트(화면단)가 서버에 어떤 정보를 달라고 요청할 때, 서버는 데이터베이스로부터 그 정보를 꺼내서 클라이언트로 보내줍니다.
Spring으로 예를 들면 DAO를 통해 DB에 접근하게 되는데 이 때 중간다리 역할로 MyBatis 같은 도구를 사용합니다.
이는 클라이언트, 서버, DB가 각각 독립된 환경임을 가정했을 때 성립할 수 있습니다.
물론 안드로이드에서도 독립된 DB로부터 데이터를 받아와서 화면단에 표현해 줄 수 있습니다.
그렇지만 굳이 외부에 있는 DB에 접근해서 정보를 가져올 필요가 없을 때, 다시 말해서 내부적으로만 데이터 교환이 이루어지는 경우가 있다고 가정한다면 외부에서 데이터를 가져오는 것은 다소 비효율적일 수 있습니다.
그래서 기기 내부에서만 사용할 수 있는 DB 시스템을 제공하는데, 안드로이드에서는 이 서비스를 Sqlite라는 이름으로 제공합니다.
우선 DBHelper가 필요합니다. 이는 클래스이며 다음과 같이 작성합니다.
class DBHelper(context: Context?,
name: String?,
factory: SQLiteDatabase.CursorFactory?,
version: Int)
: SQLiteOpenHelper(context, name, factory, version)
이 클래스는 멤버변수로 context
, name
, factory
, version
을 갖고 SQLiteOpenHelper
클래스를 상속 받습니다.
내부에는 기본적으로 onCreate
와 onUpgrade
가 오버라이드 되어야 합니다.
class DBHelper(context: Context?,
name: String?,
factory: SQLiteDatabase.CursorFactory?,
version: Int)
: SQLiteOpenHelper(context, name, factory, version) {
override fun onCreate(db: SQLiteDatabase?) {
// 테이블 생성
var sql : String = " CREATE TABLE IF NOT EXISTS TEST( " +
" SEQ INTEGER PRIMARY KEY AUTOINCREMENT, " +
" TXT TEXT) "
db?.execSQL(sql)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
var sql : String = " DROP TABLE IF EXISTS TEST "
db?.execSQL(sql)
onCreate(db)
}
}
내부에는 SQL 쿼리문이 들어가며 execSQL
을 통해 쿼리문을 실행시켜줍니다.
CRUD를 구성하여 보았습니다.
import android.annotation.SuppressLint
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
class DBHelper(context: Context?, name: String?, factory: SQLiteDatabase.CursorFactory?, version: Int)
: SQLiteOpenHelper(context, name, factory, version) {
override fun onCreate(db: SQLiteDatabase?) {
// 테이블 생성
var sql : String = " CREATE TABLE IF NOT EXISTS TEST( " +
" SEQ INTEGER PRIMARY KEY AUTOINCREMENT, " +
" TXT TEXT) "
db?.execSQL(sql)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
var sql : String = " DROP TABLE IF EXISTS TEST "
db?.execSQL(sql)
onCreate(db)
}
// CRUD
fun insert(db:SQLiteDatabase, txt:String) {
val sql = " INSERT INTO TEST(TXT) " +
" VALUES('${txt}') "
db.execSQL(sql)
}
@SuppressLint("Range")
fun read(db:SQLiteDatabase, txt: String) : String? {
val sql = " SELECT TXT FROM TEST " +
" WHERE TXT = '$txt' "
var res = db.rawQuery(sql, null)
var str:String? = ""
while(res.moveToNext()) {
str += res.getString(res.getColumnIndex("SEQ")) + " " + "" + res.getString(res.getColumnIndex("TXT"))
}
return str
}
fun update(db:SQLiteDatabase, txt:String, wantToEdit:String) {
val sql = " UPDATE TEST " +
" SET TXT = '$wantToEdit'" +
" WHERE TXT = '$txt' "
db.execSQL(sql)
}
fun delete(db:SQLiteDatabase, txt:String) {
val sql = " DELETE FROM TEST " +
" WHERE TXT = '$txt' "
db.execSQL(sql)
}
}
package com.example.sample36
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// db에 넣어주기
var dbHelper = DBHelper(this, "testdb.db", null, 1)
val insertBtn = findViewById<Button>(R.id.insertBtn)
val editInsert = findViewById<EditText>(R.id.editInsert)
val wantToEdit = findViewById<EditText>(R.id.wantToEdit)
val textView = findViewById<TextView>(R.id.textView)
val readBtn = findViewById<Button>(R.id.readBtn)
val updateBtn = findViewById<Button>(R.id.updateBtn)
val deleteBtn = findViewById<Button>(R.id.delBtn)
val database = dbHelper.writableDatabase
val db = dbHelper.readableDatabase
// CREATE
insertBtn.setOnClickListener {
val txt = editInsert.text
dbHelper.insert(database, txt.toString())
}
// READ
readBtn.setOnClickListener {
val txt = arrayOf(editInsert.text)
val res:String? = dbHelper.read(db, txt.toString())
textView.text = res
}
// UPDATE
updateBtn.setOnClickListener {
val txt = editInsert.text
val wantEdit = wantToEdit.text
dbHelper.update(database, txt.toString(), wantEdit.toString())
}
// DELETE
deleteBtn.setOnClickListener {
val txt = editInsert.text
dbHelper.delete(database, txt.toString())
}
}
}