Android Room @Query Insert Into Получение Невозможно получить доступ к базе данных в главном потоке, так как это может потенциально заблокировать интерфейс на длительный период времени. - PullRequest
0 голосов
/ 10 февраля 2020

Я выполняю запрос INSERT INTO, который принимает длинные параметры, но я получаю «Невозможно получить доступ к базе данных в главном потоке, поскольку он может потенциально заблокировать пользовательский интерфейс на длительный период времени». ошибка и считаю, что мне нужно выполнить это как задачу Asyn c, но я не могу найти шаблон для подражания. Я искал запрос Вставить, но мне нужно указать pu sh в двух длинных значениях, которые будут использоваться запросом, где это значение передается в массиве примечаний или что-то в этом роде:

private static class InsertNoteRunAsyncTask extends AsyncTask<Note, Void, Void> {
    private NoteDao noteDao;

    private InsertNoteRunAsyncTask (NoteDao noteDao) {
        this.noteDao = noteDao;
    }

    @Override
    protected Void doInBackground(Note... notes) {
        noteDao.insert(notes[0]);
        return null;
    }
}

Как запустить @Query с двумя параметрами асинхронно?

Обновление У меня нет .allowMainThreadQueries () при построении базы данных:

public static synchronized AppDatabase getInstance(Context context) {

    if (instance == null)
    {
        instance = Room.databaseBuilder(context.getApplicationContext(),
                AppDatabase.class, "user-database")
                .fallbackToDestructiveMigration()
                .addCallback(roomCallback)
                .build();
    }

    return instance;
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

В итоге я создал новый класс asyn c и адаптировал его так:

private static class InsertIntoNoteRunAsyncTask extends AsyncTask<Note, Void, Void> {
    private NoteDao noteDao;

    private InsertIntoNoteRunAsyncTask (NoteDao noteDao) {
        this.noteDao = noteDao;
    }

    @Override
    protected Void doInBackground(Note... notes) {
        int id = notes[0].getId();
        noteDao.insertInto(id);
        return null;
    }
}
0 голосов
/ 10 февраля 2020

remove allowMainThreadQueries () .it будет работать в фоновом потоке, поэтому вам не нужно использовать asynctask ().

...