sqlite
AndroidStudio
ラクスDay 20

Android Studio初心者がSQLiteを使ってアプリ作成してみた(データの表示、追加)

ラクスAdvent Calendar2018の20日目です。

はじめに

Android StudioではSQLiteを使いデータのやり取りをすることがあります。この記事では、SQLiteを使って格納したデータを表示する、データを追加する方法を紹介します。

過去の記事

Android Studioを触り初めてから過去に作成した記事を紹介します。Android Studioでアプリってそもそもどのように作成するのかを知りたい方やAPIにつないでデータを参照する方法を知りたい方はご覧下さい。

SQLiteとは

調べた感じ、作成したアプリ内に組み込める軽量のDBのようなものだそうです。Android Studioでは、ライブラリなどを入れる必要もなく、お手軽に試すことができます。SQLを使うと言えばサーバーを用意してPostgresを用意して...みたいな手順が必要だと思っていた私からすれば、かなりお手軽に使えるDBだという印象です。

今回作成するアプリ

今回、SQLiteを用いて作成した簡易なアプリの説明をします。
カラオケによく行くので、曲名と得点を記録できるアプリ(仮)を作成しました。

  • 初期画面

  • 表示ボタンを押したとき

  • データを追加し、表示ボタンを押したとき

image.png

SQLiteOpenHelperの用意

では、ここからこのアプリの作成に必要なことを解説していきます。
まずは、SQLiteを使うためにSQLiteOpenHelperを継承したクラスを作成します。
onCreate()でテーブルを作成し、DBのバージョン(DATABASE_VERSION)をあげると onUpgrade()で古いテーブルを削除して、新規のテーブルが作成されます。

java
package com.example.karaoke;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by kuwahara on 2018/09/24.
 * 参考:https://akira-watson.com/android/sqlite.html
 */
public class TestOpenHelper extends SQLiteOpenHelper {

    // データーベースのバージョン
    private static final int DATABASE_VERSION = 3;

    // データーベース情報を変数に格納
    private static final String DATABASE_NAME = "TestDB.db";
    private static final String TABLE_NAME = "testdb";
    private static final String _ID = "_id";
    private static final String COLUMN_NAME_TITLE = "title";
    private static final String COLUMN_NAME_SUBTITLE = "score";

    private static final String SQL_CREATE_ENTRIES =
            "CREATE TABLE " + TABLE_NAME + " (" +
                    _ID + " INTEGER PRIMARY KEY," +
                    COLUMN_NAME_TITLE + " TEXT," +
                    COLUMN_NAME_SUBTITLE + " INTEGER)";

    private static final String SQL_DELETE_ENTRIES =
            "DROP TABLE IF EXISTS " + TABLE_NAME;


    TestOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(
                SQL_CREATE_ENTRIES
        );

        saveData(db, "music1", 10);
        saveData(db, "music2", 0);
        saveData(db, "music3", 0);
        saveData(db, "music4", 0);
        saveData(db, "music5", 0);

    }

    // 参考:https://sankame.github.io/blog/2017-09-05-android_sqlite_db_upgrade/
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(
                SQL_DELETE_ENTRIES
        );
        onCreate(db);
    }

    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }

    public void saveData(SQLiteDatabase db, String title, int score){
        ContentValues values = new ContentValues();
        values.put("title", title);
        values.put("score", score);

        db.insert("testdb", null, values);
    }
}

(補足)DBのバージョンとupgrade

今回のアプリ作成で、DBのバージョンがイマイチ分からず、詰まったので補足しておきます。
DBのバージョンとは、アプリを起動した際にDBやテーブルの定義を変更する(今回の場合、テーブルをDROPしてCREATEし直す)かを判定するためのパラメータです。
必要もないのにアプリを起動するたび、テーブルをDROPして、CREATEして...みたいなことしていると無駄ですよね。かと言ってDBやテーブルの定義を変えたい起動しても反映されないのは困ります。そこで、DBのバージョンというパラメータを用意しておいて、DBやテーブルを再定義するかを判断しているわけです。

表示とデータの追加を実装

次に、データを表示する処理と、追加する処理を実装していきます。

  • 表示の処理は、query()メソッドを使います。その後は取得した値を結合しています。
java
Cursor cursor = db.query(
                "testdb", // DB名
                new String[] { "title", "score" }, // 取得するカラム名
                null, // WHERE句の列名
                null, // WHERE句の値
                null, // GROUP BY句の値
                null, // HAVING句の値
                null // ORDER BY句の値
        );
  • データの挿入はContentValueを使い、keyとvalueとして挿入する値を設定し、insertに渡しています。

作成したサンプルコードを下記に示します。

java
package com.example.karaoke;

import android.content.ContentValues;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private TestOpenHelper helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // DB作成
        helper = new TestOpenHelper(getApplicationContext());

        // 変数textViewに表示するテキストビューのidを格納
        textView = findViewById(R.id.text_view);
    }

    /**
     * DBからデータを全件取得し画面に表示する.
     * @param view
     */
    public void readData(View view){
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor cursor = db.query(
                "testdb",
                new String[] { "title", "score" },
                null,
                null,
                null,
                null,
                null
        );

        cursor.moveToFirst();

        StringBuilder sbuilder = new StringBuilder();

        for (int i = 0; i < cursor.getCount(); i++) {
            sbuilder.append(cursor.getString(0));
            sbuilder.append(":    ");
            sbuilder.append(cursor.getInt(1));
            sbuilder.append("点\n\n");
            cursor.moveToNext();
        }

        cursor.close();

        textView.setText(sbuilder.toString());
    }

    /**
     * データを保存する.
     * @param view
     */
    public void saveData(View view) {
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues values = new ContentValues();

        EditText editTextTitle = findViewById(R.id.edit_text_key);
        EditText editTextScore = findViewById(R.id.edit_text_value);
        String title = editTextTitle.getText().toString();
        String score = editTextScore.getText().toString();
        values.put("title", title);
        values.put("score", score);

        db.insert("testdb", null, values);
    }
}

おわりに

今回はSQLiteを使ったAndroidアプリを紹介しました。
最初はDBバージョンがイマイチ理解できず悩みましたが、サーバーを用意せずとも簡単に(アプリ内で完結して)DB操作ができるため「これは使える!」という印象です。まだデータの検索や削除ができない状態なので、今後追加していきたいと思います。

明日はkawanamiyuuさんの記事です。どうぞお楽しみに。