[AndroidStudio]Room再_今のところのまとめメモ | 徒然雑記録

徒然雑記録

中3息子と小6娘を持つママです
週二回パートに出てるけど基本家に引きこもってますw
日常生活であった事をメモのごとく書いています

こどもの影響で見始めた鬼滅の刃にハマり落ちました…

MMDとXISMOを始めました☆

とりあえず、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」

 
@Entity(tableName = "buylist_table")
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」

 
@Dao
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」についての引数が指定されてなかったけど、これがないと動かない

 
@Database(entities = {Buylist.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
    //DAO用メソッド
    public abstract BuylistDao buyListDao();
}

 

■データ読み書き処理作成

Activityファイルから呼び出す

ボタン押下処理とかに書くのならば、Fragmentファイルでも呼び出せるので「ListFragment.java」に書き込んだ

※UIのメインスレッドに書くと落ちる

各処理ごと、にこまめにDBに接続するっぽい

 

<データ読み込み用関数>

 
private List<Buylist> Blist;

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(); }
});

 

<データ追加用関数>

 
private void 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();

            //登録用データ取得
            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(); }
});

<データ削除用関数>

 
private void deleteDB() {
   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();」呼び出した場合、データ取得できない!!