MADOCHAN BLOG

30代未経験でWEBエンジニアをめざしてます!!!!!



【Android Studio】データベース(SQLite)を用いたデータ入力と読み込み

Android Studioで作成するアプリでデータベースを使用することになりました。
データベースの使用を理解するためにデータ入力と読み込みができるアプリを作成しました。

SQLiteデータベースを使うための流れ

SQLiteデータベースは以下の流れで使用します。

  1. SQLiteOpenHelperでデータベースを作成する
  2. SQLiteDatabaseデータベースを操作する
  3. 操作した結果を画面に反映する

1. SQLiteOpenHelperでデータベースを作成する

まずはSQLiteOpenHelperを継承したクラスを作成(今回はDatabaseHelperとしました)し、データベースを作成します。

package com.example.sqlapp;

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

public class DatabaseHelper extends SQLiteOpenHelper {

    // SQLiteOpenHelperには以下の4つの値のコンストラクタが必要
    // context, name(データベースの名前), カーソルのファクトリー, バージョン番号
    // カーソルのファクトリー(null): あんまり利用しないのでnullでOK。時間あれば調べる。
    // バージョン番号(はじめは1): ここのバージョンはデータベースのバージョン。例えばアプリをアップデートするときテーブル追加もすることがあるかもしれないが、そのときにイチからデータベースを構成するのではなく、onUpgradeにてアップグレードする

    public DatabaseHelper(Context context) {
        // インスタンスを生成するときに4つの値の引数を与えても良いが、今回はcontext以外は設定しておく
        super(context, "testDB", null, 1);
    }

    // データベースを作成する際に呼び出されるメソッド
    @Override
    public void onCreate(SQLiteDatabase db) {
        // テーブル作成
        db.execSQL("CREATE TABLE testDB (id INTEGER PRIMARY KEY, name TEXT, score TEXT)"); // execSQLに実行するSQL文を書く
    }

    // データベースをアップグレードする際に呼び出されるメソッド
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

2. SQLiteDatabaseデータベースを操作する

SQLIteOpenHelperを継承したクラスを作成したら、MainAcitvity(実際にデータの読み書きをするアクティビティ)でデータベースを操作できるようにします。

package com.example.sqlapp;

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

public class MainActivity extends AppCompatActivity {

    public DatabaseHelper helper = null; // SQLiteOpenHelper
    SQLiteDatabase db = null; // データベース操作のためのSQLLiteDatabase

    // TextViewとEditText用
    private TextView readText;
    private EditText inputName, inputScore;

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

        // EditTextとtextView参照先
        inputName = (EditText) findViewById(R.id.input_name);
        inputScore = (EditText) findViewById(R.id.input_score);
        readText = (TextView) findViewById(R.id.read);

        // 入力ボタン
        Button inputButton = findViewById(R.id.input_button);
        inputButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // データベースを作成するSQLiteOpenHelper
                // 追加や読み込みその都度呼び出すようにするためif文で囲う
                if (helper == null) {
                    helper = new DatabaseHelper(getApplicationContext());
                }
                if(db == null){
                    db = helper.getWritableDatabase(); // dbに書き込みをするメソッド
                }

                String name = inputName.getText().toString();
                String score = inputScore.getText().toString();

                // insert用のメソッドを作成
                insertData(db, name, score);
            }
        });

        Button readButton = findViewById(R.id.read_button);
        readButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // データベースを作成するSQLiteOpenHelper
                // 追加や読み込みその都度呼び出すようにするためif文で囲う
                if (helper == null) {
                    helper = new DatabaseHelper(getApplicationContext());
                }
                if(db == null){
                    db = helper.getReadableDatabase(); // dbに読み込みをするメソッド
                }

                // 読み込む内容用のメソッドを作成
                readData();
            }
        });
    }

    // insert用メソッド
    private void insertData(SQLiteDatabase db, String name, String score){

        // execSQL() を使うことも可能だが、ContentValueを使ってマップデータ型のkeyとvalueとして扱い書き込みすることも可能
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("score", score);

        // db.insert("追加するデータベース名", null(データを挿入する際Null値が許されない列に値が指定されていない場合代わりに利用される値を指定), "追加するデータ")
        db.insert("testdb", null, values);

    }

    // 読み込み用内容記載メソッド
    private void readData(){

        // 読み込みにはqueryメソッドを使用する。rawQueryメソッドもあるが、これはSQL文をベタがきすればOK
        // 検索結果はCursorというインスタンスで返ってくるため、Cursor型の変数に検索結果値をいれる
        Cursor c = db.query(
            "testdb", new String[] { "name", "score" },
            null,
            null,
            null,
            null,
            null
        );

        // table: テーブル名, columns: 検索結果に含める列名を指定。nullを指定すると全列の値が含まれる。
        // selection: 検索条件を指定, selectionArgs: 検索条件のパラメータ(?で指定)に置き換わる値を指定
        // groupBy: groupBy句を指定, having: having句を指定, orderBy: orderBy句を指定

        // 検索したデータの参照先を一番始めにする
        c.moveToFirst();

        // 検索結果の表示用にテキストデータを作成
        String readTextSearch = "";
        for (int i = 0; i < c.getCount(); i++) {
            readTextSearch += c.getString(0) + ": " + c.getString(1) + "\n";
            c.moveToNext(); // 検索結果の次の行へ移動
        }

        // 検索が終了したらcloseメソッドを使ってcursorを閉じる
        c.close();

        readText.setText(readTextSearch);
    }
}

3. 操作した結果を画面に反映する

readText.setText(readTextSearch);

で反映しています。

プレビュー

本当はこちらにgif画像を貼り付けたかったんですができなかったので、ツイートしたのを載せます。

参考サイト: [Android] データベース SQLite の簡単作成