これまで、ファイルや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();でダイアログ表示・・・。
"Add"を選択・・・。
ダイアログにこんな感じで入力・・・。
"OK"を押すと、こんな感じで"Taro"が挿入・・・。
2つ目・・・。
2つ目の"Jiro"も挿入された・・・。
さて、ここでいったんAndroidの[アプリ]から、SQLiteOpenHelper_を選択して、
強制終了ボタンで強制終了してみる・・・。
でSQLiteOpenHelper_を改めてもう一回起動しても、
DBから読み込まれて、リストに挿入され、リストビューに反映される・・・。
さらにSaburoと入力・・・。
問題なく追加される・・・。