【Kotlin×Android×SQLite】データベースを使いメモアプリを作る


AndridにはSQLiteというデータベース(DB)が用意されています。
これを使えばファイルでは管理できないような複雑な構造のデータも扱えるようになります。
今回はDBの操作方法について紹介します。

サンプルとして簡単なメモ機能を持ったアプリを作成します。

メモ一覧画面と、作成画面をもちます。
それぞれ以下のようなレイアウトを予定しています


今回用意するクラスは以下の通りです

  • MainActivity
    • メモの位置一覧を表示する
      • DBHelperを使用してメモの一覧を取得する
      • リストのメモのタイトルをタップするとメモ更新ページに遷移する
      • 「新規ボタン」をタップするとメモ作成ページに遷移する
  • MemoActivity
    • メモの登録、更新、削除を行う
  • DBHelper
    • SQLiteOpenHelperクラスを継承したクラス
    • DBに関する捜査をしてくれる
    • MainActivityなどでこのクラスのオブジェクトを生成して使う

また以下の記事で作成したCustomListAdapterクラス、ListItemデータクラス、list_item.xml(レイアウトファイル)を使用します。

MainActivity


このクラスの処理は以下の通りです。

  • 「新規ボタン」が押されたときの挙動設定
    • メモ作成画面(MainActivity)に遷移する
  • メモ一覧の行をタップしたときの挙動設定
    • その行のid(memosテーブルのid)を遷移先に渡しMainActivityへ遷移
  • メモ一覧の設定
    • データベースのmemosテーブルからメモの一覧を取得する


今回の課題であるDBの操作部分について解説します。
データベースからメモの一覧を取得している箇所は以下の部分です


データベースからの情報取得は DBHelperオブジェクトの readableDatabase(SQLiteDataBaseオブジェクト) プロパティが担当します。
readableDatabaseを取得すると読み込みモードでデータベースが開かれます。
実際の取得処理はreadableDatabase.useブロックの中です。

queryメソッドを使用してメモ一覧を取得します。
このメソッドに渡す引数は以下の通りです。

  • queryメソッドを使用してメモ一覧取得
    • 引数
      • テーブル名
      • 取得するカラムの配列
      • 条件式
        • メモすべてを取得したいためここでは条件を指定してない
        • 例: 「id = ?」
        • 今回はnull
      • 条件値
        • 配列で指定する
        • 今回はnull
      • グループ化
        • group by
        • カラムを指定
        • 今回はnull
      • グループの絞り込み条件
        • having
        • 今回はnull
      • ソート
        • order by
        • 今回はnull
      • 取得するレコード数
        • limit
        • 今回はnull

queryメソッドからCursorオブジェクトが返却されます。
Cursorオブジェクトは取得した結果と読み取り方法を提供するものです。
このCursorオブジェクトに対して以下のように処理を行います


  • moveToFirstメソッドで「読み取り対象」の行を一番上に設定
    • データがない場合(メモが一つもない)null
  • レコード数分以下の処理を繰り返す
    • 各レコードのidとタイトルを取得しListItemクラスのコンストラクタに渡しリストに追加する
    • moveToNextで次の行を「読み取り対象」に設定
  • ListViewのadapterを設定

以上で取得処理は終了です。

このActivityで使うレイアウトファイルです

MemoActivity

このクラスの処理は以下の通りです。

  • 「保存」ボタンの挙動設定
    • メモの作成
    • MainActivityからメモのid(memoId)が送られてきている場合、更新
    • 作成、更新後MainActivityに戻る
  • 「削除」ボタンの挙動設定
    • メモの削除
    • memoIdを指定する
    • 削除後MainActivityに戻る
  • 「戻る」ボタンの挙動設定
    • MainActivityに戻る
  • メモ情報の表示
    • memoIdがある場合のみ
    • memoIdを使いデータベースからメモ情報を取得する
    • 取得後Viewに設定

・メモ情報の取得処理

一覧取得の時と同じようにqueryメソッドを使用します。
今回は条件式にidを指定しています。
そのため条件値にもメモIDをもった配列を渡しています。
あとは一覧取得と同じですね。
moveToFirstで読み取り対象を指定して、情報をViewに設定しています。

メモの保存、更新処理

メモの保存処理は取得処理とは違いwritableDatabaseプロパティを使います。
これでデータベースが書き込みモードで開かれます。
readableDatabase使用時もそうでしたが、
処理後データベースを自動で閉じさせるためuseブロックを使用しています。

memoIdがある場合更新、ない場合登録という挙動になっています。

レコードの作成にはinsertメソッドを使用します。

insertメソッドの引数です。

  • テーブル名
  • null列に設定する値を指定
    • 今回はnull
  • 登録する値
    • ContentValuesオブジェクトを使用
    • 設定する情報はタイトルと本文

updateメソッドの引数

  • テーブル名
  • 更新する情報
    • ContentValuesオブジェクトを使用
    • 設定する情報はタイトルと本文
  • 条件式
    • idを指定
  • 条件値
    • memoIdを使用

メモの削除処理

「削除」ボタンが押されたら削除できるようにします。
保存処理部分と同じようにwritableDatabaseプロパティを使用します。

このプロパティのdeleteメソッドを使用して削除します。

このメソッドの引数は以下の通りです。

  • テーブル名
  • 条件式
    • idを指定
  • 条件値
    • memoIdw使用

ちなみに削除後、その旨のアラートメッセージを表示します

このActivityのレイアウトファイルです。

DBHelper


DBを操作するためにSQLiteOpenHelperを継承したクラスを作成します。
このクラスがDBの作成やテーブルの作成、データの操作のための機能を提供してくれます。


onCreateメソッドがデータベースが作成されたときに実行される関数です。
ここではmemosテーブルを作成しています。
すでにデータベースが作成されていた場合はこの関数は実行されません。

onUpgradeはデータベースのバージョンが更新された時、
onOpenはデータベースが開かれたときに実行されます。

memosテーブルの構成とレコード例です。

idtitlecontent
1タイトル1めも1
めも1
2タイトル2めも2


以上で完成です。
細かな部分で改良の余地はあると思いますが、
一通りメモ機能として動くサンプルが作れたかなと思います。