如何反转 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
我正在制作一个闹钟应用程序,我想编写一个查询来切换一些闹钟属性,这是我的闹钟 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