とりあえず、UI使わないのならば、DBの読み書きはできる、というあたりまでの理解ができたのでまとめてメモしておきます。
この先、またリポジトリ作ったりするのでコードがぐちゃぐちゃになるだろうし…
■ファイル構成
「db」というフォルダを作って、その配下に「Entity」「Dao」「Database」を入れたらわかりやすい
■Gradleファイル追記
「build.gradle」ファイルの「dependencies」に依存関係情報を追加
dependencies {
val room_version = "2.6.1"
implementation("androidx.room:room-runtime:$room_version")
annotationProcessor("androidx.room:room-compiler:$room_version")
}
■Entityファイル作成
「Buylist.java」
public class Buylist {
//--------------------
// 定義するカラム
//--------------------
@PrimaryKey(autoGenerate = true)
public int id;
public String buy_name;
public boolean check_flg;
//--------------------
// コンストラクタ
//--------------------
public Buylist(String buy_name, boolean check_flg) {
this.buy_name = buy_name;
this.check_flg = check_flg;
}
public int getId() {
return this.id;
}
public String getBuyName(){
return this.buy_name;
}
public boolean getCheckFlg(){
return this.check_flg;
}
}
■Daoファイル作成
「BuylistDao.java」
public interface BuylistDao {
//全データを昇順で取得
@Query("SELECT * FROM buylist_table ORDER BY id ASC")
List<Buylist> getAll();
//id指定でデータ削除
@Query("DELETE FROM buylist_table WHERE id = :x")
void delete(int x);
//データ追加
@Insert
void insert(Buylist buylist);
}
■Databaseファイル作成
「AppDatabase.java」
公式のコードだと「exportSchema」についての引数が指定されてなかったけど、これがないと動かない
public abstract class AppDatabase extends RoomDatabase {
//DAO用メソッド
public abstract BuylistDao buyListDao();
}
■データ読み書き処理作成
Activityファイルから呼び出す
ボタン押下処理とかに書くのならば、Fragmentファイルでも呼び出せるので「ListFragment.java」に書き込んだ
※UIのメインスレッドに書くと落ちる
各処理ごと、にこまめにDBに接続するっぽい
<データ読み込み用関数>
private void loadDB() {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
@Override
public void run() {
AppDatabase db = Room.databaseBuilder(requireContext().getApplicationContext(),
AppDatabase.class, "app_database")
.build();
//Daoのインスタンス作成
BuylistDao dao = db.buyListDao();
Blist = dao.getAll();
int list_size = Blist.size();
if(list_size > 0){
Buylist entity = Blist.get(0); //1つ目データを表示
int ids = entity.getId();
String names= entity.getBuyName();
boolean checks = entity.getCheckFlg();
binding.txtDBtest.setText(names + "_" + checks + "_" + ids);
}else{
binding.txtDBtest.setText("保存データなし");
}
}
});
}
<データ読み込み用ボタン押下処理>
※onCreateView内にOnClickListener書いても動く
binding.btnDisp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { loadDB(); }
});
<データ追加用関数>
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
@Override
public void run() {
try {
AppDatabase db = Room.databaseBuilder(requireContext().getApplicationContext(),
AppDatabase.class, "app_database")
.build();
//Daoのインスタンス作成
BuylistDao dao = db.buyListDao();
//登録用データ取得
String buy_name = binding.NewWordEdit.getText().toString();
boolean buy_check_flg = false;
Buylist entity = new Buylist(buy_name, buy_check_flg);
dao.insert(entity);
//追加項目入力エリア初期化
binding.NewWordEdit.setText("");
}catch(Exception e){
binding.txtDBdebug.setText("try catch エラー");
}
}
});
}
<データ追加用ボタン押下処理>
※onCreateView内にOnClickListener書いても動く
binding.btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { weiteDB(); }
});
<データ削除用関数>
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
@Override
public void run() {
try {
AppDatabase db = Room.databaseBuilder(requireContext().getApplicationContext(),
AppDatabase.class, "app_database")
.build();
//Daoのインスタンス作成
BuylistDao dao = db.buyListDao();
//削除データのid取得
Buylist entity = Blist.get(0); //1つ目データを削除
int list_id = entity.getId();
dao.delete(list_id);
}catch(Exception e){
binding.txtDBdebug.setText("try catch エラー");
}
}
});
}
<データ削除用ボタン押下処理>
※onCreateView内にOnClickListener書いても動く
binding.btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { deleteDB(); }
});
onCreateView直下で、データ読み込み関数「loadDB();」呼び出した場合、データ取得できない!!