SQLiteOpenHelper

これまで、ファイルやSharedPreferencesでデータを保存してきたが、住所録など同じ形式のデータを大量に保存するとなると、やはりデータベースを扱いたいところ・・・。
Androidは、標準でSQLiteを組み込んでおり、こういったデータもSQLiteで保存して管理できる・・・。

SQLiteOpenHelperは、SQLiteの操作に役立つヘルパークラス・・・。

SQLiteOpenHelper | Android Developers

このクラスを継承して、独自に定義したDBのヘルパークラスを作る・・・。

入力された名前、年齢、住所をListViewに挿入しつつ、DBにも挿入するようなプログラムを作る・・・。

まず、activity_main.xml・・・。

ListViewのlistview1がメイン・・・。

つづいて、リストビューのアイテムのレイアウトlist_item.xml・・・。

TextViewで名前と年齢と住所を縦に・・・。

つづいて、入力用のダイアログのレイアウトdialog.xml・・・。

TextViewとEditViewを横に並べたものを、3つ縦に・・・。

また、menuフォルダを作成し、main.xmlにメニューアイテムのレイアウトも書いておく・・・。

で、strings.xmlは、

メニューアイテムAdd、そしてダイアログに表示するラベル("Name", "Age", "Address")・・・。

さて、Java側は、まずリストのアイテムクラスListItem・・・。

Stringのname, intのage, Stringのaddress・・・。
これだけ・・・。

で次にリストビューに表示するためのアダプタを用意・・・。

ArrayAdapterの項で使ったものをそのまま利用・・・。

そしていよいよ、今回のメインであるSQLiteOpenHelperを継承したListItemDBHelperの定義・・・。

最初のほうで、DBのファイル名や、CREATE_TABLE文や、DROP_TABLE文をあらかじめ定義しておく・・・。
_idがプライマリーキーになっているが、これ自体は挿入時に自動で決定され、基本的には使わない・・・。
あくまでname, age, addressが扱うデータ・・・。

コンストラクタは、親コンストラクタにDBのファイル名とDB_VERSIONを渡してる・・・。
これはとりあえず、こういうものということで・・・。

onCreateはDB作成時の処理・・・。
db.execSQLでCREATE_TABLEを実行して、テーブル作成・・・。
これは、list_item.dbが作成されていない初回のみ発生する・・・。

onUpgradeは、DBバージョンのアップグレード時に呼ばれる・・・。
いったんDROP_TABLEしてからonCreateとなっているが、アップグレードについては、後々・・・。

さて、最後にMainActivity・・・。

これだけのものが必要になってくる・・・。
ListItemDBHelperのhlprとSQLiteDatabaseのsqlite・・・。これでDB操作をする・・・。

まず、onCreateではListItem型のArrayListを作成して、R.layout.list_itemと紐づけてadapterを取得・・・。
そして、listView1にadapterをセット・・・。
まだこの時点ではアイテムは1つも入っていない・・・。

ListItemDBHelperを生成、hlpr.getReadableDatabaseでDBも取得・・・。

sqlite.rawQueryで"SELECT * FROM listitem;"を実行したら、戻り値のCursor型cursorに結果の情報が入る・・・。

cursorの中身を見ていく・・・。
cursor.getCountで行数がわかる・・・。
cursor.moveToFirstで先頭に移動・・・。
cursor.getInt(0)は、その行の0列目をintとして取得するということ・・・。
まあ、これは_id・・・。
cursor.getString(1)は、1列目をStringとして取得するということ・・・。
これがnameかな・・・。
という感じで、ageを2列目、addressを3列目から取得していく・・・。
で取得したname, age, addressは、ListItemオブジェクトitemを作成して、そこに入れて、list.addでitemを追加・・・。
これでようやく1つ入る・・・。
これを行数文繰り返す・・・。
終ったらcursor.closeで閉じる・・・。

最終的にはsqliteもいったんclose・・・。

最後にadapter.notifyDataSetChangedでadapterを更新してようやく追加した内容がlistView1に反映される・・・。

次に、メニューアイテムAddで追加するとき・・・。

Addが選択されたら、LayoutInflaterでR.layout.dialogをもとにレイアウトが作成される・・・。
builder.setView(layout)で、このレイアウトをダイアログにセット・・・。

"OK"ボタンが押されたら、各EditTextの内容を取得・・・。

今度は、挿入するのでhlpr.getWritableDatabaseでDBを取得・・・。
ContentValues型valuesに各値をセットして、sqlite.insertOrThrowでlistitemテーブルに挿入・・・。

テーブルに挿入したら、listにも追加・・・。そしてadapterを更新・・・。

"Cancel"ボタンは何もしない・・・。これでbuilder.create().show();でダイアログ表示・・・。

f:id:BG1:20160623071555p:plain

"Add"を選択・・・。

f:id:BG1:20160623071643p:plain

ダイアログにこんな感じで入力・・・。

f:id:BG1:20160623071734p:plain

"OK"を押すと、こんな感じで"Taro"が挿入・・・。

f:id:BG1:20160623071831p:plain

2つ目・・・。

f:id:BG1:20160623071903p:plain

2つ目の"Jiro"も挿入された・・・。

f:id:BG1:20160623072050p:plain

さて、ここでいったんAndroidの[アプリ]から、SQLiteOpenHelper_を選択して、

f:id:BG1:20160623072242p:plain

強制終了ボタンで強制終了してみる・・・。
でSQLiteOpenHelper_を改めてもう一回起動しても、

f:id:BG1:20160623072514p:plain

DBから読み込まれて、リストに挿入され、リストビューに反映される・・・。

f:id:BG1:20160623072806p:plain

さらにSaburoと入力・・・。

f:id:BG1:20160623072839p:plain

問題なく追加される・・・。

Sample/android/SQLiteOpenHelper/SQLiteOpenHelper/src/SQLiteOpenHelper/SQLiteOpenHelper_ at master · bg1bgst333/Sample · GitHub