さて、私はこのプロジェクトのためにこのデータベースを作成するためにAndroid部屋を使用しようとしています。
まず第一に、これが私が問題に関して私の卒業ファイルに持っているものです:
_//Room database
implementation "androidx.lifecycle:lifecycle-viewmodel:2.1.0"
implementation "androidx.room:room-runtime:2.2.3"
kapt "androidx.room:room-compiler:2.2.3"
implementation "androidx.room:room-ktx:2.2.3"
_
これがDAOコードです。
_@Dao
interface DebtsDao {
@Query("SELECT * FROM debts")
fun getDebtsList() : List<Debts>
@Query("SELECT * FROM debts WHERE name LIKE :name")
fun getNamedDebt(name : String) : Debts
@Insert
fun insertInDatabase(debt : Debts)
@Delete
fun deleteFromDatabase(debt : Debts)
}
_
データベースビット:
_@Database(entities = arrayOf(Debts::class), version = 1)
abstract class AppDatabase : RoomDatabase()
{
abstract fun debtsDao() : DebtsDao
}
_
これは私がそれを使う関数です:
_ fun refreshRecyclerView()
{
val database = Room.databaseBuilder(applicationContext, AppDatabase::class.Java, "account").build()
val list : List<Debts> = database.debtsDao().getDebtsList()
recycler_view_debts.layoutManager = LinearLayoutManager(this)
recycler_view_debts.adapter = RecAdapter(this, list)
}
_
私はAndroidのページのチュートリアルに従ってみましたが、それは期待どおりに機能しませんでした。 Android Studioに次のエラーが発生しました。
_E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.project.watchingmoneyfly, PID: 17067
Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.project.watchingmoneyfly/com.project.watchingmoneyfly.Activities.MainActivity}: Java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2646)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2707)
at Android.app.ActivityThread.-wrap12(ActivityThread.Java)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1460)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:154)
at Android.app.ActivityThread.main(ActivityThread.Java:6077)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:866)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:756)
Caused by: Java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
at androidx.room.RoomDatabase.assertNotMainThread(RoomDatabase.Java:267)
at androidx.room.RoomDatabase.beginTransaction(RoomDatabase.Java:351)
at com.project.watchingmoneyfly.RoomDatabase.DebtsDao_Impl.insertInDatabase(DebtsDao_Impl.Java:79)
at com.project.watchingmoneyfly.Activities.MainActivity.onCreate(MainActivity.kt:25)
at Android.app.Activity.performCreate(Activity.Java:6662)
at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1118)
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2599)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2707)
at Android.app.ActivityThread.-wrap12(ActivityThread.Java)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1460)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:154)
at Android.app.ActivityThread.main(ActivityThread.Java:6077)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:866)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:756)
_
これは問題の先頭になるはずです:長期間にわたってUIをロックする可能性があるため、メインスレッド上のデータベースにアクセスできない。
私はここで何を見逃していますか?前もって感謝します!!
客室データベースは、メインスレッドで操作を実行したくないです。
タスクを実行するには,バックグラウンドスレッドを使用する必要があります。
あなたは使うことができます
_.allowMainThreadQueries()
_
アドバイスソリューションをスキップするには、スレッドを使用してタスクを実行することをお勧めします。
以下はいくつかの選択肢です。
1)
AsyncTask.execute(() -> //Write your db code here);
2)
_ Thread {
//Do your database´s operations here
}.start()
_