いつもお世話になっております。
早速ですが受け取ったPush通知をデータベースに保存し、Push通知一覧みたいなのをサンプルで作成しているのですが、Roomでupdateするやり方が理解できず投稿しました。
※公式サイトでSQLiteではなくRoomを使用することを強くおすすめしますと記述されていたため、Roomを実装していますがSQLiteの知識無しで実装しています。(Mysqlについては元々Webプログラマーをやっていたので問題ないです)
公式サイト
https://developer.android.com/training/data-storage/room?hl=ja
とりあえずサンプルアプリを作成していて、参照と追加は自力でできました。
機種内にあるデータベースを閲覧するにはいくつかやり方があるみたいですが、自分がやっているやり方は「DeviceFileExplorer」から欲しいプロジェクト内にある「databases」の三つファイルをダウンロードして「DB Browser for SQLite」に投げて表示しています。
参考サイト
https://www.virment.com/view-sqlite-database-by-android-studio/
↓ここからが質問↓
結局何がしたいの?というと、具体的にやりたい事としてはプッシュ通知を受け取ったらテーブル内にある「batch」を0にしたいです。とりあえずとしてはupdateが出来ないと次に進めないので@updateのやり方が知りたいです。
自分が色々調べていると@Updateですがいくつかのやり方があることを知りました。
パターン1 @Queryを使うやり方
java
1@Query("UPDATE userdata SET batch=0 WHERE id = :id") 2void update(int id);
パターン2 アップデート用のクラスを作るやり方
java
1@Update 2void update(User user);
パターン3 ViewModelを使ったやり方
java
1val memo = Memo(id, title, content, byteArrayList) 2memoViewModel.update(memo)
※ViewModelですがstackOverflowで解決案としてあったので記述しています。
URL:https://stackoverflow.com/questions/45789325/update-some-specific-field-of-an-entity-in-android-room
Roomの公式サイトをみても上記パターン2の一文のみしか記述しておらず、Keyはどうやって指定しているのか、非同期でやるとしてどんな風に実行する流れになるのか書いておりません(もしくはどこかに上記のサイトではないところで説明しているのか?)
色々試しても結局どういう仕組みなのか理解していないのでプログラムを書くにも書けない状態です。
インサート文は色んな参考サイトがあったのでできました。
自分が実装したインサート文です。
java
1@Entity(tableName = PushList.TABLE_NAME) 2public class PushList { 3 4 public static final String TABLE_NAME = "pushlist"; 5 6 @PrimaryKey(autoGenerate = true) 7 @NonNull 8 @ColumnInfo(name = "id") 9 public int id; 10 11 @ColumnInfo(name = "title") 12 public String title; 13 14 @ColumnInfo(name = "message") 15 public String message; 16 17 @ColumnInfo(name = "receive_time") 18 public String receive_time; 19 20 @ColumnInfo(name = "batch") 21 public int batch; 22 23 @ColumnInfo(name = "login_flg") 24 public int login_flg; 25 26}
java
1@Dao 2public interface PushListDao { 3 4 @Query("select * from " + PushList.TABLE_NAME) 5 List<PushList> findAll(); 6 7 @Insert 8 void insert(PushList pushList); 9 10 @Update 11 void update(PushListUpdate pushListUpdate); 12}
java
1@Database(entities = {PushList.class,User.class}, version = 1) 2public abstract class UserDatabase extends RoomDatabase { 3 public abstract UserDao userDao(); 4 public abstract PushListDao pushListDao(); 5}
java
1MainActivity.java 2 3public class MainActivity extends AppCompatActivity { 4 5 User user; 6 PushList pushList; 7 PushListUpdate pushListUpdate; 8 9 boolean loginFlg = false; 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.activity_main); 15 16 //Userクラス 17 user = new User(); 18 19 pushList = new PushList(); 20 21 pushListUpdate = new PushListUpdate(); 22 23 String dateTime = getNowDate(); 24 25 PushListInsertAsync pushListInsertAsync = new PushListInsertAsync("Push通知のタイトルです","Push通知の本文ですー",dateTime,1,0,getApplication(),pushList); 26 pushListInsertAsync.execute(); 27 28 //ここで色々UPDATEを試しています 29 //PushListUpdateAsync pushListUpdateAsync = new PushListUpdateAsync(0,0,getApplication(),pushListUpdate); 30 //pushListUpdateAsync.execute(); 31 32 } 33 /** 34 * 現在日時をyyyy-MM-dd HH:mm:ss形式で取得する.<br> 35 */ 36 public static String getNowDate(){ 37 final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 38 final Date date = new Date(System.currentTimeMillis()); 39 return df.format(date); 40 } 41}
java
1非同期通信でやらないといけないとのことでとりあえずAsyncTaskでやりました 2 3public class PushListInsertAsync extends AsyncTask<Void, Void, Void> { 4 5 //必要なもん宣言 6 String title; 7 String message; 8 String receive_time; 9 int batch; 10 int login_flg; 11 Context context; 12 PushList pushList; 13 14 public PushListInsertAsync(String title,String message,String receive_time,int batch,int login_flg,Context context,PushList pushList) { 15 16 this.title = title; 17 this.message = message; 18 this.receive_time = receive_time; 19 this.batch = batch; 20 this.login_flg = login_flg; 21 this.context = context; 22 this.pushList = pushList; 23 24 } 25 26 @Override 27 protected Void doInBackground(Void... params) { 28 29 pushList.title = title; 30 pushList.message = message; 31 pushList.receive_time = receive_time; 32 pushList.batch = batch; 33 pushList.login_flg = login_flg; 34 35 UserDatabase db = Room.databaseBuilder(context,UserDatabase.class,"userdata").build(); 36 37 db.pushListDao().insert(pushList); 38 39 return null; 40 } 41 42}
長文になってしまい本当に申し訳ございません。
どなたかご教授頂ければ幸いです。
回答1件
あなたの回答
tips
プレビュー