Я создал базу данных 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% совпадает).
@Faisal Спасибо за этот комментарий! Это была фоновая ветка. Я пытался удалить из потока пользовательского интерфейса. Я переместил функцию удаления репозитория, чтобы использовать AsyncTask для вызова удаления, и это исправлено. Спасибо еще раз.




Согласно комментарию @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;
}
}
можете ли вы загрузить свой код инициализации БД, например, откуда вы вызываете свой запрос на удаление? подтвердить еще 1 вещь, которую вы на самом деле делаете в фоновом потоке?