Как я могу инвертировать логическое значение внутри запроса SQL? - PullRequest
0 голосов
/ 29 мая 2019

Я создаю приложение тревоги, и я бы написал запрос, который бы переключал некоторые свойства тревоги, вот мой класс тревоги.

@Entity
data class Alarm(
    val label: String?,
    var isEnabled: Boolean,
    val ringTime: LocalTime,
    val occursOn: MutableSet<Day>,
    var isVibrationEnabled: Boolean,
    @PrimaryKey(autoGenerate = true) var id: Int? = null
)

Вот мой запрос, который должен инвертировать значение вибрации

    @Query("UPDATE Alarm SET isVibrationEnabled = NOT isVibrationEnabled WHERE id = :alarmId")
    internal abstract fun toggleVibration(alarmId: Int): Completable

Приложение прекрасно компилируется, поэтому кажется, что запрос действителен, однако после его выполнения значение не инвертируется и оно остается прежним

1 Ответ

1 голос
/ 30 мая 2019

Я считаю, что ваша проблема не переключение, это работает.

Скорее всего, проблема в том, что WHERE не выбирает строку (или ожидаемую строку) и, таким образом, значение передается как параметр при вызове toggleVibration функция не является идентификатором сигнала тревоги или ожидаемого сигнала тревоги.

Пример

Рассмотрим следующий пример (в Java, а не в Kotlin для удобства): -

AlarmEntity Alarm.java

public class Alarm {

    @PrimaryKey(autoGenerate = true)
    private long id;
    private String label;
    private boolean isEnabled;
    private boolean isVibrationEnabled;

    public Alarm() {

    }

    public Alarm(String label, boolean isEnabled, boolean isVibrationEnabled) {
        this.label = label;
        this.isEnabled = isEnabled;
        this.isVibrationEnabled = isVibrationEnabled;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public boolean isEnabled() {
        return isEnabled;
    }

    public void setEnabled(boolean enabled) {
        isEnabled = enabled;
    }

    public boolean isVibrationEnabled() {
        return isVibrationEnabled;
    }

    public void setVibrationEnabled(boolean vibrationEnabled) {
        isVibrationEnabled = vibrationEnabled;
    }
}
  • уменьшен набор столбцов для удобства

AlarmDao.java

@Dao
public interface AlarmDao {

    @Insert
    long[] insertAlarm(Alarm... alarms);
    @Insert
    long insertAlarm(Alarm alarm);
    @Query("SELECT * FROM Alarm")
    List<Alarm> getAllAlarms();
    @Query("UPDATE Alarm SET isVibrationEnabled = NOT isVibrationEnabled WHERE id = :id")
    int toggleVibration(long id);
}

Код из упражнения для тестирования: -

    alarmDao = mDB.getAlarmDao();
    // Add a copule of alarms
    alarmDao.insertAlarm(
            new Alarm("Alarm001",true,true),
            new Alarm("Alarm002",false,false)
    );
    // Get the Alarms and output them to the log
    List<Alarm> myalarms = alarmDao.getAllAlarms();
    for (Alarm a: myalarms) {
        Log.d("ALARMBEFORE","Label = " + a.getLabel() + " Enabaled = " + String.valueOf(a.isEnabled()) + " Vibration =  " + a.isVibrationEnabled());
    }
    //<<<<<<<<<< Toggle the first alarm >>>>>>>>>>
    alarmDao.toggleVibration(myalarms.get(0).getId());
    // Again get all the alarams and output them to the log
    myalarms = alarmDao.getAllAlarms();
    for (Alarm a: myalarms) {
        Log.d("ALARMAFTER","Label = " + a.getLabel() + " Enabaled = " + String.valueOf(a.isEnabled()) + " Vibration =  " + a.isVibrationEnabled());
    }

Результат

05-30 10:34:33.853 D/ALARMBEFORE: Label = Alarm001 Enabaled = true Vibration =  true
05-30 10:34:33.853 D/ALARMBEFORE: Label = Alarm002 Enabaled = false Vibration =  false
05-30 10:34:33.856 D/ALARMAFTER: Label = Alarm001 Enabaled = true Vibration =  false
05-30 10:34:33.856 D/ALARMAFTER: Label = Alarm002 Enabaled = false Vibration =  false

т.е. для Alarm001 значение isVibrationEnabaled было изменено с true на false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...