Skip to content

db & sql

hotsummmer edited this page Apr 10, 2019 · 18 revisions
  • [중요] db를 사용하려면 Gradle dependencies에 implementation 'net.zetetic:android-database-sqlcipher:3.5.8@aar' 를 추가해야 함
  • 실제 db를 확인하고 싶을 경우 https://github.com/sqlitebrowser/sqlitebrowser/releases/tag/v3.10.1 (버전 3.10.1이어야 함)을 다운 받아서 Android Studio의 View > Tool Windows > Device File Explorer에서 data > data > android > 해당 패키지 > databases > 저장할 db를 선택하고 save As 한후 DB browser에서 '데이터베이스 열기' 모든파일 선택후 해당 db를 열고 확인 가능(!!단, Ch.sql.addDb에서 password가 null이 아니어야 확인 가능)

sql[목차]

Ch.sql

DataBase

Ch.sql

  • DB에 대한 처리

Ch.sql.addQuery()

Ch.sql.addQuery(k:String, body:String)
  • 쿼리 key와 내용을 add함
"""
local_img_create--CREATE TABLE IF NOT EXISTS local_img(
    rowid INTEGER PRIMARY KEY AUTOINCREMENT,
    filePath VARCHAR(255) NOT null,
    fileDate VARCHAR(255) NOT null
);
local_add--insert into local_img(filePath,fileDate)values(@filePath:string@,@fileDate:string@);
local_remove_all--delete from local_img;
local_list--select * from local_img
""".split(";").forEach {
    val a = it.split("--")
    Ch.sql.addQuery(a[0].trim(), a[1].trim())
}
Ch.sql.addDb("img", "local_img_create", null, "1234")
with(Ch.sql.db("img")){
    exec("local_remove_all")
    Ch.thread.pool(Runnable {
        Ch.content.getImage(MediaStore.Images.Media._ID, false, MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_ADDED)?.let{
            if(it.count > 0 && it.moveToFirst()) {
                val pathIdx = it.getColumnIndex(MediaStore.Images.Media.DATA)
                val dateIdx = it.getColumnIndex(MediaStore.Images.Media.DATE_ADDED)
                do {
                    exec("local_add", "filePath" to it.getString(pathIdx), "fileDate" to it.getString(dateIdx))
                } while (it.moveToNext())
            }
            it.close()
        }
        select("local_list")?.map{_,arr->Data("${arr[1]}", "${arr[2]}")}?.let {
            Ch.thread.main(Runnable {
                val adapter = ListAdapter(it)
                scan?.let {
                    it.view.findViewById<RecyclerView>(R.id.list).adapter = adapter
                }
                adapter.notifyDataSetChanged()
            })
        }
    })
}
"""
ch_create--CREATE TABLE IF NOT EXISTS ch_res(
    res_rowid INTEGER PRIMARY KEY AUTOINCREMENT,
    id VARCHAR(255) NOT null,
    contents TEXT NOT null,
    UNIQUE(id)
);
ch_add--insert into ch_res(id,contents)values(@id:string@,@contents:string@);
ch_id--select count(*)from ch_res where id=@id:string@;
ch_remove--delete from ch_res where id=@id:string@;
ch_getId--select contents from ch_res where id=@id:string@;
ch_get--select id,contents from ch_res;
ch_list--select id from ch_res
""".split(";").forEach {
    val a = it.split("--")
    Ch.sql.addQuery(a[0].trim(), a[1].trim())
}
Ch.sql.addDb("ch", "ch_create", null, null)
"""
image_temp_create--CREATE TABLE IF NOT EXISTS image_temp(
    rowid INTEGER PRIMARY KEY AUTOINCREMENT,
    id VARCHAR(10) NOT null,
    image VARCHAR(255) NOT null,
    date VARCHAR(10) NOT null,
    time VARCHAR(10) NOT null,
    inout VARCHAR(10) NOT null
);
image_temp_remove--delete from image_temp;
image_temp_add--insert into image_temp(id,image,date,time,inout)values(@id:string@,@image:string@,@date:string@,@time:string@,@inout:string@);
image_temp_update--update image_temp set image=@image:string@ where id='first';
image_temp_update_etc--update image_temp set date=@date:string@,time=@time:string@,inout=@inout:string@ where id='first';
image_temp_image--select image from image_temp LIMIT 1;
image_temp_date--select date from image_temp LIMIT 1;
image_temp_time--select time from image_temp LIMIT 1;
image_temp_inout--select inout from image_temp LIMIT 1
""".split(";").forEach {
    val a = it.split("--")
    Ch.sql.addQuery(a[0].trim(), a[1].trim())
}
Ch.sql.addDb("image_temp", "image_temp_create", null, "1234")
Ch.sql.db("image_temp").exec("image_temp_remove")
Ch.sql.db("image_temp").exec("image_temp_add", "id" to "first", "image" to "", "date" to "", "time" to "", "inout" to "")
Ch.sql.db("staff").exec("staff_add", "image" to Ch.sql.db("image_temp").s("image_temp_image"), "name" to name, "rank" to rank)

Ch.sql.addDb()

Ch.sql.addDb(k:String, create:String, assetPath:String?, pass:String?)
  • db(DataBase 객체)를 추가함
  • create에 들어간 key는 addQuery로 넣은 쿼리의 해당 DB의 생성자 key(내용은 'CREATE TABLE IF NOT EXISTS ch_res...')
Ch.sql.addDb("ch", "ch_create", null, null)

Ch.sql.db()

Ch.sql.db(key:String)
@JvmStatic lateinit var db:DataBase
db = ChSql.db("ch")
db.select("ch_get")?.forEach { _, arr ->
    val v = arr.map { "$it" }
    _try { JSONObject(v[1]) }?.let { Res(v[0], it).set() }
}
_try{Ch.sql.db("seller")}?.let {
    val v = it.select("se_get") { User() }
    if (v.isNotEmpty()) {
        App.user = v[0]
        Ch.net.api("islogin") {
            val json = it.result as JSONObject
            App.isLoading(false)
            if (json._int("islogin") == 1) App.router.push(Main, false)
            else {
                Signin.ok = {
                    App.router.push(Main, false)
                }
                App.modalRouter.push(Signin, false)
            }
        }
    }
}

Ch.sql.removeDb()

Ch.sql.removeDb(k:String)
  • db(DataBase 객체)를 삭제함
Ch.sql.removeDb("ch")

Ch.sql.getQuery()

Ch.sql.getQuery(key:String):ChQuery
  • 해당 key로 된 query가 있으면 query(ChQuery 객체)를 리턴
val it = Ch.sql.getQuery(key) ?: run {
    msg = "invalid query:$key"
    return null
}

Ch.sql.removeQuery()

Ch.sql.removeQuery(k:String)
  • 해당 key를 가진 쿼리를 삭제함

Ch.sql.addProvider()

Ch.sql.addProvider(k:String, provider:prov)
  • provider를 추가

DataBase

  • DataBase 객체의 메서드들

remove()

remove()
  • 해당 DataBase 객체를 삭제함

exec()

exec(k: String, vararg arg:Pair<String, Any>):Int
  • 해당 key의 쿼리를 실행함
  • 인자가 필요하면 Pair형("id" to v)으로 사용
  • 리턴 값은 쿼리가 실행되면 쿼리가 실행된 카운트. 없으면 0일 리턴된다.
val db = Ch.sql.db("ch")
db.exec("ch_remove", "id" to v)
val db = Ch.sql.db("ch")
db.exec("ch_add", "id" to res.id, "contents" to res.toJSON())

select()

select(k:String, isRecord:Boolean = false, vararg arg:Pair<String, Any>)
select(k:String, vararg arg:Pair<String, Any>, block:()->T)
  • 해당 key의 쿼리를 실행하고 쿼리 결과 값을 받음
  • isRecord : 결과 값이 Record형이 필요할 때(1개일 때)
  • 인자가 필요하면 Pair형("id" to v)으로 사용
db = ChSql.db("ch")
//ch_get--select id,contents from ch_res;
db.select("ch_get")?.forEach { _, arr ->
    val v = arr.map { "$it" }
    _try { JSONObject(v[1]) }?.let { Res(v[0], it).set() }
}
//ch_list--select id from ch_res
val ids:String get()= db.select("ch_list")?.rs?.joinToString(",") {"\"${it[0]}\""} ?: ""
Ch.sql.db("seller")}?.let {
    val v = it.select("se_get") { User() }
}

lastId()

lastId():Int
  • last insert rowid를 리턴함
  • 결과값이 없을 때 -1을 리턴함

i()

i(k: String, vararg arg:Pair<String, Any>): Int
  • 결과 값이 1개이고, 받을 타입을 알고 있을 때 사용
//ch_id--select count(*)from ch_res where id=@id:string@;
if(db.i("ch_id", "id" to res.id) == 0){
    //ch_add--insert into ch_res(id,contents)values(@id:string@,@contents:string@);
    db.exec("ch_add", "id" to res.id, "contents" to res.toJSON())
    res.set()
}

l()

i(k: String, vararg arg:Pair<String, Any>): Long
  • 결과 값이 1개이고, 받을 타입을 알고 있을 때 사용

d()

d(k: String, vararg arg:Pair<String, Any>): Double
  • 결과 값이 1개이고, 받을 타입을 알고 있을 때 사용

f()

f(k: String, vararg arg:Pair<String, Any>): Float
  • 결과 값이 1개이고, 받을 타입을 알고 있을 때 사용

s()

s(k: String, vararg arg:Pair<String, Any>): String
  • 결과 값이 1개이고, 받을 타입을 알고 있을 때 사용
//ch_getId--select contents from ch_res where id=@id:string@;
_try{Res("", JSONObject(db.s("ch_getId", "id" to v))).remove()}