Little Strange Software

スマホアプリの開発を行う LittleStrangeSoftware のブログです。

SQLiteOpenHelperクラスを使う前の準備メモ

 どうも!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

 

結論。あとは使ってみてから。

 書き出してみて、ちょっと自分の中では整理がついた、ような気がします。

 あとは、使ってみてから、でないと机上の空論にしかならなさそうなので、今回の記事はこのへんで終わっておきますね。 

 

  ではまた!次回もよろしくです!