Я реализовал базу данных комнат и имею несколько транзакций запросов, которые выполняются в отдельном потоке от пользовательского интерфейса. Этот конкретный запрос получает исключение для Невозможно получить доступ к базе данных в основном потоке, поскольку он потенциально может заблокировать пользовательский интерфейс на длительный период времени . Я не понимаю, почему эта конкретная транзакция пытается выполняться в потоке пользовательского интерфейса. Прикреплено исключение недопустимого состояния.
2020-05-06 06:40:33.365 23022-23022/com.grgapps.checkingin E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.grgapps.checkingin, PID: 23022
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.query(RoomDatabase.java:323)
at androidx.room.util.DBUtil.query(DBUtil.java:83)
at com.grgapps.checkingin.ContactTableDao_Impl.findContactByContactTablePrimaryKey(ContactTableDao_Impl.java:350)
at com.grgapps.checkingin.CheckInContactsFilterAndDisplayAdapter.deleteItemFromContactListDisplay(CheckInContactsFilterAndDisplayAdapter.java:116)
at com.grgapps.checkingin.CheckInContactsFilterAndDisplayAdapter$1.onClick(CheckInContactsFilterAndDisplayAdapter.java:178)
at android.view.View.performClick(View.java:5610)
at android.view.View$PerformClick.run(View.java:22265)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
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)
Это таблица контактов.
package com.grgapps.checkingin;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.ContactsContract;
import android.widget.QuickContactBadge;
import androidx.annotation.NonNull;
import androidx.room.Entity;
import androidx.room.Index;
import androidx.room.PrimaryKey;
import java.sql.Blob;
import java.util.BitSet;
@Entity(tableName = "contact_table",
indices = {@Index("contactTablePrimaryKey"),
@Index("contactContractsKey")})
public class ContactTable {
@PrimaryKey(autoGenerate = true)
@NonNull
private int contactTablePrimaryKey;
@NonNull
private String contactContractsKey;
@NonNull
private String contactDisplayName;
@NonNull
private String contactLastName;
@NonNull
private String contactFirstName;
private String contactMiddleName;
Это код инициирование запроса
ContactTable contactFindContactByContactTablePrimaryKeyQuery = contactTableDao
.findContactByContactTablePrimaryKey(mContactTablePrimaryKey);
Это объект DataAccessObject базы данных комнат
@Query("SELECT * FROM contact_table WHERE contactTablePrimaryKey = :contactTablePrimaryKey")
public abstract ContactTable findContactByContactTablePrimaryKey(int contactTablePrimaryKey);
Это репозиторий таблиц базы данных комнат с асинхронным c Код задания
private static class FindContactByContactTablePrimaryKeyQueryAsyncTask extends
AsyncTask<Integer, Void, ContactTable> {
private ContactTableDao asyncTaskDao;
private ContactTableRepository delegate = null;
FindContactByContactTablePrimaryKeyQueryAsyncTask(ContactTableDao dao) {
asyncTaskDao = dao;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected ContactTable doInBackground(final Integer... params) {
Log.i(TAG, "ContactTableRepository doInBackground: ");
return asyncTaskDao.findContactByContactTablePrimaryKey(params[0]);
}
@Override
protected void onPostExecute(ContactTable result) {
delegate.findContactByContactTablePrimaryKeyAsyncFinished(result);
}
}
private void findContactByContactTablePrimaryKeyAsyncFinished(ContactTable results) {
Log.i(TAG, "ContactTableRepository asyncFinished: ");
foundContactByContactTablePrimaryKey = results;
}
'''