どうも!LSSです!
このブログを始める前に、きっとアプリ開発で避けて通れない?SQLiteデータベースの扱いに触れるために、メモ帳アプリを作った事があったのですが、SQLiteOpenHelperを使ってSQLiteデータベースを操作するにあたり、思いのほか命名するものが多く、ぐだぐだとした名前になってしまったので、ちょっとその時の事を振り返り、整理するために書いてみます。
※今回は特に、本気で自分用のメモみたいなもので、全く人様の参考にはならないと思われますw
以前に書いてたコード
SQLs.kt
package jp.wings.nikkeibp.a20190911intent
import android.content.Context import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper
class SQLs(context: Context): SQLiteOpenHelper(context,DATABASE_NAME,null,DATABASE_VERSION){
companion object{ private const val DATABASE_NAME="kikainamemochou.db" private const val DATABASE_VERSION=1
}
override fun onCreate(db: SQLiteDatabase) { db.execSQL("CREATE TABLE memodb ( _id INTEGER PRIMARY KEY AUTOINCREMENT, tag TEXT,memo TEXT,date TEXT)" ) }
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
}
}
|
etActivity.kt
package jp.wings.nikkeibp.a20190911intent
import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import kotlinx.android.synthetic.main.activity_et.* import java.lang.Exception import java.text.SimpleDateFormat import java.util.*
class etActivity : AppCompatActivity() {
val SQLs0= SQLs(this@etActivity)
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_et)
try {
val dbs = SQLs0.writableDatabase val cursor = dbs.rawQuery("select * from memodb order by date", null) while (cursor.moveToNext()) { val cId = cursor.getColumnIndex("_id") val cMemo = cursor.getColumnIndex("memo") val cDate = cursor.getColumnIndex("date") tx0.text = cursor.getString(cMemo).toString() + "\n" + cursor.getLong(cId).toString() + " " + cursor.getString(cDate).toString() + "\n" + tx0.text } cursor.close()
} catch (e: Exception) { tx0.text = e.toString() + "\n" + tx0.text }
}
fun bt0clk( v:View ){
val df = SimpleDateFormat("yyyy/MM/dd HH:mm:ss") val date = Date()
// テキストビューに追記 tx0.text = et0.text.toString() + "\n" + tx0.text
// データベースに登録 var dbs = SQLs0.writableDatabase var SQLstr = dbs.compileStatement("INSERT INTO memodb (tag, memo, date) VALUES ('', ? , ? )") SQLstr.bindString(1,et0.text.toString()) SQLstr.bindString(2,df.format(date)) SQLstr.executeInsert()
et0.setText("") }
override fun onDestroy() { SQLs0.close() super.onDestroy() } }
|
パッケージ名が読んでた書籍のままだった頃ですなw
使用した名前について
ええと、名前を拾い出してみると…
SQLs=SQLiteOpenHelperクラスを継承したクラス
SQLs0=SQLs0のインスタンス
dbs=SQLs0を「書き込み可能なDBとして扱う」用の名前※
kikainamemochou.db=データベース名(アプリ毎に決めて良さそう)
memodb=テーブル名(用途に応じた命名でOK)※
cursor=データベースから取り出したデータ結果。(rawQueryの結果)※
テーブル内の列名(どんなデータを扱うかによって可変のため省略)※
データを取り出す時の列のインデックス(同じく略)※
※はメインのコードから使用頻度の高いもの
…こんなところでしょうか。
SQLs内で引数として使ってるものは気にしない事にしますw
このサンプルではテーブルを一つしか扱っていませんが、複数利用するとなると、SQLs.kt内のonCreateも修正が必要そうなのに気をつけなくちゃかなぁ。
流れとして書くと、
SQLiteOpenHelper(既存)→SQLs(独自クラス)→SQLs0(インスタンス)→dbs
…こう考えると、インスタンスにとりあえず0をつけるとか、LSSらしくて間違ってはいなかったのかな?って気がしてきましたw
自分が「ややこしい」と思っていたのは、インスタンスから更にdbsを作って、実際に使うのはそっちだった、ってあたりだったようです。
あと、dbsを2回宣言していますが、これ
val SQLs0= SQLs(this@etActivity)
に続けて書けば1回 でいいのかも?
※2019/10/1追記!
何故かはまだ分かりませんが、↑これするとエラーなくインストールできるものの、アプリが落ちます!まだまだ謎は深い…。
どう名付けると(自分的に)理解しやすいかな…
SQLs…SQLiteOpenHelperの継承クラス、なので「SQLoh」とでもしましょうか。
※大文字のO(オー)は0(ゼロ)と混同しそうなので嫌いw
って、それを言ったら小文字のl(エル)もですが。
SQLs0…「sqloh0」小文字にしたらクラスじゃない、って思いやすいかなと。
dbs…writableなDBって事で「dbW」として、あと読み取り専用の「dbR」も作るかな。
sqloh0Wとかだと、多用するのに長くて嫌っぽい(自分が)
cursor…これ悩ましい…参考にしたサイトではほぼcursorで統一されていて、
定義する時はクエリだけど、読みだす時は1レコード…。
で、挙動としてはmoveToNextで次行へ次行へと動くのでcursorがベストかな。
任意の名前の部分は「自分のものにしたい」と思うところから自分なりの
名前をつけるのが今のLSSですが、う~ん。…cursorのままでいいやw
結論。あとは使ってみてから。
書き出してみて、ちょっと自分の中では整理がついた、ような気がします。
あとは、使ってみてから、でないと机上の空論にしかならなさそうなので、今回の記事はこのへんで終わっておきますね。
ではまた!次回もよろしくです!