Запрос на удаление базы данных Android Room без удаления строк

Я создал базу данных Room для хранения сообщений в приложении чата и определил таблицу следующим образом:

@Entity(tableName = "message_table")
public class Message {

    @NonNull
    @PrimaryKey(autoGenerate = true)
    public long id;

    @NonNull
    public String body;

    @NonNull
    @ColumnInfo(name = "phone_number")
    public String phoneNumber;

    public Message(String body, String phoneNumber) {
        this.body = body;
        this.phoneNumber = phoneNumber;
    }
}

И когда я запрашиваю все сообщения для данного номера телефона, он может получить их идеально (используя следующий запрос):

@Query("SELECT * FROM message_table WHERE phone_number = :phoneNumber LIMIT 50")
LiveData<List<Message>> getMessagesByNumber(String phoneNumber);

Но когда я пытаюсь удалить все сообщения, связанные с одним и тем же номером телефона, с помощью следующей команды, я каждый раз удаляю 0 строк:

@Query("DELETE FROM message_table WHERE phone_number = :phoneNumber")
int delete(String phoneNumber);

Я что-то упустил здесь? Я огляделся, но не могу найти решение этой проблемы. (И я четырежды проверил, что номер телефона, используемый как в вызовах Select, так и в Delete, на 100% совпадает).

можете ли вы загрузить свой код инициализации БД, например, откуда вы вызываете свой запрос на удаление? подтвердить еще 1 вещь, которую вы на самом деле делаете в фоновом потоке?

Faisal 12.03.2019 00:58

@Faisal Спасибо за этот комментарий! Это была фоновая ветка. Я пытался удалить из потока пользовательского интерфейса. Я переместил функцию удаления репозитория, чтобы использовать AsyncTask для вызова удаления, и это исправлено. Спасибо еще раз.

Daniel Bailey 12.03.2019 02:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
4 128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно комментарию @Faisal к вопросу. Я забыл запустить мой метод удаления в фоновом потоке.

Я переместил свой код удаления в AsyncTask, и теперь он работает. Вот задача функции репозитория:

private static class deleteAsyncTask extends AsyncTask<Void, Void, Void> {

    private MessageDao mAsyncTaskDao;
    private String mPhoneNumber = null;

    public deleteAsyncTask(MessageDao dao) {
        mAsyncTaskDao = dao;
    }

    public deleteAsyncTask(MessageDao dao, String phoneNumber) {
        mAsyncTaskDao = dao;
        mPhoneNumber = phoneNumber;
    }


    @Override
    protected Void doInBackground(Void... voids) {
        if (mPhoneNumber == null) {
            mAsyncTaskDao.deleteAll();
        }
        else {
            mAsyncTaskDao.delete(mPhoneNumber);
        }
        return null;
    }
}

Другие вопросы по теме