如何反转 SQL 查询中的布尔值?

How can I invert a boolean value inside an SQL query?

我正在制作一个闹钟应用程序,我想编写一个查询来切换一些闹钟属性,这是我的闹钟 class。

@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

应用程序编译正常,所以看起来查询是有效的,但是在我执行它之后,值没有反转并且保持不变

我相信您的问题不是切换,而是有效。

而是问题在于 WHERE 子句 没有选择一行(或预期的行),因此 作为参数传递的值 在调用 toggleVibration 函数时 不是警报的 ID 或预期的警报。

例子

考虑以下示例(为方便起见,使用 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);
}

要测试的 Activity 代码:-

    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