[Android Studio] テーブルの行を取得する(SELECT)

どうも、tatsuです!

今日は、テーブルの行を取得する(SELECT)方法を説明します。

※この記事で使用しているAndroid Studioのバージョンは2.3.3です。

テーブルの行を取得する(SELECT)

テーブルを作成しデータをINSERTできたら、プログラム側からINSERTしたデータを取得して表示したいと思います。
SELECT構文だけでなく、MainActivity.javaからどのようにデータベースにアクセスするのかにも注目してください。

CustomOpenHelper.java

CustomOpenHelper.javaは以下の通りです。

public class CustomOpenHelper extends SQLiteOpenHelper {

    // データベース自体の名前(テーブル名ではない)
    static final private String DBName = "TATSU_DB";
    // データベースのバージョン(2,3と挙げていくとonUpgradeメソッドが実行される)
    static final private int VERSION = 1;

    // コンストラクタ 以下のように呼ぶこと
    public CustomOpenHelper(Context context){
        super(context, DBName, null, VERSION);
    }

    // データベースが作成された時に実行される処理
    @Override
    public void onCreate(SQLiteDatabase db) {
        /**
         * テーブルを作成する
         * execSQLメソッドにCREATET TABLE命令を文字列として渡すことで実行される
         * 引数で指定されているものの意味は以下の通り
         * 引数1 ・・・ id:列名 , INTEGER:数値型 , PRIMATY KEY:テーブル内の行で重複無し , AUTOINCREMENT:1から順番に振っていく
         * 引数2 ・・・ name:列名 , TEXT:文字列型
         * 引数3 ・・・ price:列名 , INTEGER:数値型
          */
        db.execSQL("CREATE TABLE FOOD_TABLE (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "name TEXT, " +
                "price INTEGER)");

        /**
         * FOOD_TABLEに行を追加する
         * VALUESの前と後に()があるが、前の()に列名、後の()に実際入れる値を指定する
         * idは自動で振られるため指定しない
         */
        db.execSQL("INSERT INTO FOOD_TABLE(name, price) VALUES('ラーメン', 700)");
    }

    // データベースをバージョンアップした時に実行される処理
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        /**
         * テーブルを削除する
         */
        db.execSQL("DROP TABLE IF EXISTS FOOD_TABLE");

        // 新しくテーブルを作成する
        onCreate(db);
    }

    // データベースが開かれた時に実行される処理
    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
    }
}

MainActivity.java

MainActivity.javaは以下の通りです。

public class MainActivity extends AppCompatActivity {

    // CustomOpenHelperクラスを定義
    CustomOpenHelper helper = null;

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

        // idがsearchButtonのボタンを取得
        Button button = (Button) findViewById(R.id.searchButton);
        // clickイベント追加
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                // CustomOpenHelperクラスがまだインスタンス化されていなかったらインスタンス化する
                if(helper == null){
                    helper = new CustomOpenHelper(MainActivity.this);
                }
                // データベースを取得する
                SQLiteDatabase db = helper.getWritableDatabase();
                try {
                    // rawQueryというSELECT専用メソッドを使用してデータを取得する
                    Cursor c = db.rawQuery("select id, name, price from FOOD_TABLE", null);
                    // Cursorの先頭行があるかどうか確認
                    boolean next = c.moveToFirst();
                    
                    // 最終的に表示する文字列
                    String dispStr = "";
                    // 取得した全ての行を取得
                    while (next) {
                        // 取得したカラムの順番(0から始まる)と型を指定してデータを取得する
                        String rowdata = String.valueOf(c.getInt(0))+" , ";// idを取得
                        rowdata += c.getString(1)+" , ";// nameを取得
                        rowdata += String.valueOf(c.getInt(2));// priceを取得
                        dispStr += rowdata + "\n";// \nは改行を表し、複数行取れた場合に一行ごとに改行するため
                        // 次の行が存在するか確認
                        next = c.moveToNext();
                    }
                    dispStr += "取得完了";

                    // TextViewに取得したデータを表示
                    ((TextView) findViewById(R.id.searchText)).setText(dispStr);
                } finally {
                    // finallyは、tryの中で例外が発生した時でも必ず実行される
                    // dbを開いたら確実にclose
                    db.close();
                }
            }
        });
    }
}

activity_main.xml

activity_main.xmlは以下の通りです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.android.tatsu.myapplication.MainActivity">

    <TextView
        android:id="@+id/searchText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>

    <Button
        android:id="@+id/searchButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="データを取得">
    </Button>

</LinearLayout>

作成されたテーブル

↓ボタン押下前

↓ボタン押下後

補足
なぜSELECTではexecSQLではなくrawQueryを使用するのかですが、実はexecSQLには返り値がありません。
SELECTでは検索結果を取得するため返り値が必須になりますので、rawQueryという専用のメソッドがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です