AndroidStudioでデータベースを使ってみたい&BMI計算②

スポンサーリンク
スポンサーリンク
スポンサーリンク

やっとSQLite

BMIの計算ができたので、計算結果をDBに保存しよー。で、保存したのを取り出そー。

DBヘルパークラス

なるものが必要らしい。コピペしてこう。

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "bmihistory.db";
    private static final int DATABASE_VERSION = 1;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        StringBuilder sb = new StringBuilder();
        sb.append("CREATE TABLE bmihistory (");
        sb.append("_id INTEGER PRIMARY KEY,");
        sb.append("date TEXT,");
        sb.append("height REAL,");
        sb.append("weight REAL,");
        sb.append("result REAL");
        sb.append(");");
        String sql = sb.toString();

        db.execSQL(sql);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

SQL文の「,」が抜けてて数時間ハマった。コンストラクタの引数はcontextだけでよかったみたい。IDEさんに作ってもらってたら、なんか色んなのがついてきてて、それは消した。onCreateはDBがない時一回だけ呼ばれるみたい。

DatabaseHelper helper = new DatabaseHelper(BMIActivity.this);
        SQLiteDatabase db = helper.getWritableDatabase();

        try {
            String sqlInsert = "INSERT INTO bmihistory (_id, date, height, weight, result) VALUES (?, ?, ?, ?, ?)";
            SQLiteStatement statement = db.compileStatement(sqlInsert);
//            statement.bindLong(1, 1);
            statement.bindString(2, resTime);
            statement.bindDouble(3, dHeight);
            statement.bindDouble(4, valueWeight.doubleValue());
            statement.bindDouble(5, Double.valueOf(result));

            statement.executeInsert();
        } finally {
            db.close();
        }

これでデータ保存ができてるはず…。今はtry-finallyじゃなくて

        try (SQLiteDatabase db = helper.getWritableDatabase()){
            String sqlInsert = "INSERT INTO bmihistory (_id, date, height, weight, result) VALUES (?, ?, ?, ?, ?)";
            SQLiteStatement statement = db.compileStatement(sqlInsert);
//            statement.bindLong(1, 1);
            statement.bindString(2, resTime);
            statement.bindDouble(3, dHeight);
            statement.bindDouble(4, valueWeight.doubleValue());
            statement.bindDouble(5, Double.valueOf(result));

            statement.executeInsert();
        }

こうでいいみたい。意味はよく分かってない。

で、ここで確認のためにSQLAndroidを使おうとしたんだけど

run-as: package has corrupt installation: net.dalomo.lifecalculator

と出てしまって何も表示されない。なぜだ。諦めて他のサイトで見た、Terminalからadb shell→run-asもやってみたけどダメ。なんかroot権限が必要らしい。しょうがないので普通にコード書いて取得してみる。趣旨がずれてきてるな。

DBからデータを取得

DatabaseHelper helper = new DatabaseHelper(BMIActivity.this);
try (SQLiteDatabase db = helper.getWritableDatabase()) {
    String sql = "SELECT * FROM bmihistory";
    Cursor cursor = db.rawQuery(sql, null);
    StringBuilder sb = new StringBuilder();

    while (cursor.moveToNext()) {
        int idxDate = cursor.getColumnIndex("date");
        int idxheight = cursor.getColumnIndex("height");
        int idxweight = cursor.getColumnIndex("weight");
        int idxresult = cursor.getColumnIndex("result");
        sb.append(cursor.getString(idxDate));
        sb.append(", ");
        sb.append(cursor.getString(idxheight));
        sb.append(", ");
        sb.append(cursor.getString(idxweight));
        sb.append(", ");
        sb.append(cursor.getString(idxresult));
        sb.append("\n");
    }

    TextView tv = findViewById(R.id.textView2);
    tv.setText(sb.toString());

    cursor.close();
}

できたー。できたんだけど、なんだかなぁ。DBをDBのまま編集してみたくて始めたんだけど、最終的にBottun押してTextViewに表示するいつものやつになった。まぁ、取得の仕方がさわりだけでも分かったからいっかー。

ただ、この場合だと、一つの計算につき一つのDBって感じになるの?あ、いや、TABLEを増やせばいいのかな?あれ、でもコンストラクタは一回しか呼ばれないしな…。ちょっとこんがらがってきたからまたあとで考えよう。ていうかこんなんだからGUIで確認したいんだけどな。CUIわかんないよ。

参考

SQLiteで利用可能なデータ型
テーブルには値を格納するためのカラムを定義しますが、どのカラムにどのような値を格納するかに応じてデータ型を指定することができます。ここでは SQLite のカラムで指定可能なデータ型について解説します。
[Android] 現在日時の取得方法 - Qiita
概要 端末の現在日時を「yyyy/MM/dd HH:mm:ss」形式の文字列で取得する。 サンプルコード MainActivity.java /** * 現在日時をyyyy/MM/dd HH:mm:ss形式で取得する....
データの追加(INSERT文)
INSERT 文を使ってテーブルにデータを追加する方法について解説します。全てのカラムに値を指定してデータを追加する以外に、カラムを指定してデータを追加することもできます。
https://wa3.i-3-i.info/word12448.html
Android SQLite db pull error - Stack Overflow

コメント

タイトルとURLをコピーしました