やっと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わかんないよ。
参考
[affi id=2]
https://www.dbonline.jp/sqlite/type/index1.html
https://qiita.com/zuccyi/items/d9c185588a5628837137
https://www.dbonline.jp/sqlite/insert/index1.html
https://wa3.i-3-i.info/word12448.html
https://stackoverflow.com/questions/25179590/android-sqlite-db-pull-error
