web-dev-qa-db-ja.com

エラー:メインスレッド上のデータベースにアクセスできないため、長期間UIをロックする可能性があります。 - Android kotlinの使用)

さて、私はこのプロジェクトのためにこのデータベースを作成するために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をロックする可能性があるため、メインスレッド上のデータベースにアクセスできない。

私はここで何を見逃していますか?前もって感謝します!!

3
Kleckus

客室データベースは、メインスレッドで操作を実行したくないです。

タスクを実行するには,バックグラウンドスレッドを使用する必要があります。

あなたは使うことができます

_.allowMainThreadQueries()
_

アドバイスソリューションをスキップするには、スレッドを使用してタスクを実行することをお勧めします。

以下はいくつかの選択肢です。

1)

AsyncTask.execute(() -> //Write your db code here);

2)

_ Thread {
       //Do your database´s operations here
       }.start()
_
3
Vir Rajpurohit