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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

646閲覧

Android Java Roomでのデータベース構築エラー

haaaa

総合スコア2

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2022/12/27 15:04

android javaでyoutubeにあったRoomでデータベース構築を行い、ソースコードをコピペして作ったのですが、動画ですと上手く動いているのに私の場合なぜか動きません。。。

実現したいこと

https://www.youtube.com/watch?v=PAGVed1Rkfc&t=99s
上記のリンクは、前編になっていますが中編と後編に分かれています。

発生している問題・エラーメッセージ

ビュー階層を作成した元のスレッドだけが、そのビューに触れることができます。
というエラーが出ます。

エラーメッセージ E/AndroidRuntime: FATAL EXCEPTION: pool-4-thread-1 Process: jp.ac.jec.cm0110.roomdb, PID: 27833 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6871) at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1079) at android.view.ViewGroup.invalidateChild(ViewGroup.java:5242) at android.view.View.invalidateInternal(View.java:13625) at android.view.View.invalidate(View.java:13589) at android.view.View.invalidate(View.java:13573) at android.widget.TextView.checkForRelayout(TextView.java:7350) at android.widget.TextView.setText(TextView.java:4479) at android.widget.TextView.setText(TextView.java:4336) at android.widget.TextView.setText(TextView.java:4311) at jp.ac.jec.cm0110.roomdb.MainActivity$1.run(MainActivity.java:116) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761) ### 該当のソースコード ```MainActivity.java import androidx.appcompat.app.AppCompatActivity; import androidx.room.Room; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.util.Calendar; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView roomtext1; private TextView roomtext2; private TextView roomtext3; private TextView roomtextdebug; private TextView roomtextmax; private Button roombtnleft; private Button roombtnright; private Button roombtnadd; private Button roombtndelete; private Button roombtnalldelete; private String monthtext; private String daytext; private String hourtext; private String minutetext; private String secondtext; private int listpage = 1; private int listmax = 0; private int listid = 0; private List<RoomEntity> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); roomtext1 = findViewById(R.id.roomtext1); roomtext2 = findViewById(R.id.roomtext2); roomtext3 = findViewById(R.id.roomtext3); roomtextdebug = findViewById(R.id.roomtextdebug); roomtextmax = findViewById(R.id.roomtextmax); roombtnleft = findViewById(R.id.roombtnleft); roombtnleft.setOnClickListener(this); roombtnright = findViewById(R.id.roombtnright); roombtnright.setOnClickListener(this); roombtnadd = findViewById(R.id.roombtnadd); roombtnadd.setOnClickListener(this); roombtndelete = findViewById(R.id.roombtndelete); roombtndelete.setOnClickListener(this); roombtnalldelete = findViewById(R.id.roombtnalldelete); roombtnalldelete.setOnClickListener(this); loaddb(); } private void loaddb() { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(new Runnable() { @Override public void run() { RoomTimeDatabase db = Room.databaseBuilder(getApplicationContext(), RoomTimeDatabase.class, "roomtime").build(); RoomTimeDao dao = db.roomtimedao(); list = dao.getall(); listmax = list.size(); if(list.size() > 0) { RoomEntity entity = list.get(listpage - 1); int year = entity.getyear(); int month = entity.getmonth(); if(month < 10) { monthtext = "0" + month; } else { monthtext = "" + month; } int day = entity.getday(); if(day < 10) { daytext = "0" + day; } else { daytext = "" + day; } int hour = entity.gethour(); if(hour < 10) { hourtext = "0" + hour; } else { hourtext = "" + hour; } int minute = entity.getminute(); if(minute < 10) { minutetext = "0" + minute; } else { minutetext = "" + minute; } int second = entity.getsecond(); if(second < 10) { secondtext = "0" + second; } else { secondtext = "" + second; } listid = entity.getId(); roomtext2.setText(year + ":" + monthtext + ":" + daytext + ":" + hourtext + ":" + minutetext + ":" + secondtext); roomtext3.setText(listpage + "/" + listmax); roomtextmax.setText("データ保存数:" + listmax); } else { roomtext3.setText("データ無し"); roomtext2.setText(""); roomtextmax.setText("データ保存数:0"); roomtextdebug.setText(""); } } }); } private void writedb() { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(new Runnable() { @Override public void run() { try { Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH) + 1; int day = c.get(Calendar.DATE); int hour = c.get(Calendar.HOUR); int minute = c.get(Calendar.MINUTE); int second = c.get(Calendar.SECOND); RoomTimeDatabase db = Room.databaseBuilder(getApplicationContext(), RoomTimeDatabase.class, "roomtime").build(); RoomTimeDao dao = db.roomtimedao(); RoomEntity entity = new RoomEntity(year, month, day, hour, minute, second); dao.insert(entity); roomtextdebug.setText("書き込み完了"); listpage = listmax + 1; loaddb(); } catch(Exception e) { roomtextdebug.setText("エラー"); } } }); } private void deletedb() { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(new Runnable() { @Override public void run() { try { RoomTimeDatabase db = Room.databaseBuilder(getApplicationContext(), RoomTimeDatabase.class, "roomtime").build(); RoomTimeDao dao = db.roomtimedao(); dao.delete(listid); listpage = 1; loaddb(); } catch (Exception e) { roomtextdebug.setText("エラー"); } } }); } private void deletealldb() { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(new Runnable() { @Override public void run() { try { RoomTimeDatabase db = Room.databaseBuilder(getApplicationContext(), RoomTimeDatabase.class, "roomtime").build(); RoomTimeDao dao = db.roomtimedao(); dao.deleteall(); listpage = 1; loaddb(); } catch (Exception e) { roomtextdebug.setText("エラー"); } } }); } @Override public void onClick(View v) { switch(v.getId()) { case(R.id.roombtnadd): writedb(); break; case(R.id.roombtnleft): if(listpage > 1) { listpage -= 1; loaddb(); roomtextdebug.setText(""); } break; case(R.id.roombtnright): if(listpage < listmax) { listpage += 1; loaddb(); roomtextdebug.setText(""); } break; case(R.id.roombtndelete): deletedb(); break; case(R.id.roombtnalldelete): deletealldb(); break; } } }

MainActivityでエラーが発生しているので載せておきます。
残りのMainActivity.java以外のファイルは、下記のgithubと同様です。(コピペ)
https://gist.github.com/uta-water/02b913db4db5c20f3bde38e417246a07

試したこと

https://accelebiz.hatenablog.com/entry/2016/09/01/061934
このように、エラーメッセージで検索して出てきた対処法は試しました。

補足情報(FW/ツールのバージョンなど)

android stujioは、Bumblebee|2021.1.1Patch2でMinimum SDKは、API23です。

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

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

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

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

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

jimbe

2022/12/27 16:42

>ビュー階層を作成した元のスレッドだけが、そのビューに触れることができます。 >というエラーが出ます。 『Roomでのデータベース構築エラー』では無いのでしたら、件名を修正した方が良いと思います。
jimbe

2022/12/27 16:55 編集

>~ エラーメッセージで検索して出てきた対処法は試しました。 試して、どうだったのでしょうか。 リンク先の対処で(正しく書けていれば)出来るはずですが。
jimbe

2022/12/27 18:01 編集

前編の動画に 中・後編へのリンクが見当たらなかったので twitter から張っておきます。 中編で MainActivity を編集して動作させていますね。 中編: https://www.youtube.com/watch?v=MY1s56ZPI7Y 後編: https://www.youtube.com/watch?v=r7p_RdBgDbY また、 github には環境系のファイルが何も入っていないので最終的にどのような設定・状況なのかは分かりませんが、前編の最初で AndroidStudio 4.1.1 でプロジェクト作成からやっています。 room-runtime / room-compiler は 2.3.0 。
guest

回答1

0

ベストアンサー

https://stackoverflow.com/questions/15928551/no-error-calling-textview-settext-from-non-ui-thread-why

動作してしまう方が古くからあるバグみたいな感じです。
TextView.setText も Android の仕様に従って EDT で動作させなければなりませんが、動作してしまう場合もあるということのようです。
作者の過去の作品では Handler を使っているようですので、たまたま忘れていたら動作してしまった状態に気が付いていないということでしょうか。

ゼロ付けるのに延々文字列編集していたり投げっぱなしスレッドで排他無しでフィールドを弄ったりしていますので、あくまで room の動画であって、他はそれ程気を遣っていないのかもしれません。
作者に例外の事を伝えれば修正してくれるのでは無いでしょうか。

投稿2022/12/27 18:28

編集2022/12/27 18:39
jimbe

総合スコア12646

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問