Android 如何在SQL查询中反转布尔值?
我正在制作一个报警应用程序,我想写一个查询来切换一些报警属性,这是我的报警类Android 如何在SQL查询中反转布尔值?,android,sqlite,rx-java2,android-architecture-components,Android,Sqlite,Rx Java2,Android Architecture Components,我正在制作一个报警应用程序,我想写一个查询来切换一些报警属性,这是我的报警类 @Entity data class Alarm( val label: String?, var isEnabled: Boolean, val ringTime: LocalTime, val occursOn: MutableSet<Day>, var isVibrationEnabled: Boolean, @PrimaryKey(autoGenera
@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
)
这个应用程序编译得很好,所以看起来查询是有效的,但是在我执行它之后,值没有反转,并且保持不变。我相信你的问题不是切换,这是有效的 相反,问题在于WHERE子句没有选择行(或预期行),因此调用切换振动函数时作为参数传递的值不是报警或预期报警的id 例子 考虑以下示例(为了方便起见,使用Java而不是Kotlin):- AlarmEntityAlarm.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;
}
}
@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);
}
- 为方便起见,减少了列集
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;
}
}
@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);
}
i、 e.对于Alarm001,IsVibrationEnabled值已从true切换为false@forpas布尔类型如果没有布尔类型,我会假设false为0,true为1。表中是否存在id等于您绑定为
:alarmId
的值的行?显然这就是问题所在,正如米凯特指出的那样
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