質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

3507閲覧

Android Studio SQLite Room Updateの参考サイトがない

ludolf

総合スコア39

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2020/04/27 04:32

編集2020/05/01 05:58

いつもお世話になっております。

早速ですが受け取った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}

長文になってしまい本当に申し訳ございません。
どなたかご教授頂ければ幸いです。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/01 06:28

問題と質問とやったことの切れ目がわからないから回答は尽きづらいとおもうぞ
ludolf

2020/05/01 07:14 編集

質問ありがとうございます! 分かりずらいですよね、、 ついさっき質問を少し修正しました 「Roomの公式サイトをみても...」 https://developer.android.com/training/data-storage/room/accessing-data?hl=ja 上記のサイトの「更新する」の欄でパターン2のやつが書いてあるのですが、 下記の説明が書かれているんですね。 「public void updateUsers(User... users);」 「(User... users)」引数にUserクラスを入れていますがUserクラスは何をしているのかがわかならないのでプログラム書こうにも書けない状態です、、 あと「User...」 の...てんてんってどういう意味なのか調べても出てこないです、、 長ったらしい説明で分かりずらいと思いますので、一言でまとめるとUPDATEの参考サイトがあれば参考サイトで、もしくはUserクラスで何をやっているのかご教授頂きたいです。
ludolf

2020/05/14 06:02

ご回答ありがとうございます! 思いっきり勘違いしていました、、 UserクラスはFirebase側が用意しているクラスだと思っていました、、 なので引数は何を渡せばいいか全く分からなかったです(笑) 可変長引数っていうのですね、ありがとうございます! 上記を踏まえるとすぐにできそうです! 何か分からない問題が出た際は再度お聞きするかもしれません、 よろしくお願いします!
guest

回答1

0

自己解決

自己解決しました。

恥ずかしながらUserクラスはFirebase側に用意されているクラスだと勘違いしていて、できませんでしたが無事作成できました。

懸念していたKeyの指定ですが、下記の公式サイトに書いてある通りすでに登録されているIDを指定すると自動的にKeyの指定になるみたいです。

https://developer.android.com/reference/android/arch/persistence/room/Update?hl=ja

asahina1979様・hoshi-takanori様、ご回答ありがとうございました!

投稿2020/05/14 07:46

ludolf

総合スコア39

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問