やっと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 文を使用します。ここでは SQLite でテーブルにデータを追加する方法について解説します。すべてのカラムに値を指定してデータを追加する以外に、カラムを指定してデータを追加することもできます。
https://wa3.i-3-i.info/word12448.html

Android SQLite db pull error
i am trying to pull db from my app but i keep getting this error in eclipse->DDMS->FileExplorer transfer error: Permission denied Failed to pull
コメント