无法更新 Room 数据库中的布尔数组
Cannot update Boolean Array in Room database
我正在尝试 更新 android 房间数据库中的一个布尔数组,但它抛出了这个错误
E/SQLiteLog: (1) near "?": syntax error in "UPDATE alarm_table SET mDaysOfWeekArr=?,?,?,?,?,?,?,? WHERE mAlarmId=?"
查询:(AlarmDao.java)
@TypeConverters({Converter.class})
@Query("UPDATE alarm_table SET mDaysOfWeekArr=:daysOfWeekArr WHERE mAlarmId=:alarmId")
void updateRecAlarmStatus(Boolean[] daysOfWeekArr, int alarmId);
插入/读取布尔数组时正确的值保存在数据库中(使用查询)
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(AlarmEntity alarmEntity);
房间数据库存储库(AlarmRepository.java)
public void updateRecAlarmStatus(final Boolean[] daysOfWeekArr, final int alarmId) {
databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
alarmDao.updateRecAlarmStatus(daysOfWeekArr, alarmId);
}
});
}
使用 recyclerView 中的 onClick 调用上述函数并使用 getter 和 Boolean[] 中的更改值从实体读取数据
daysOfWeek[1] = true;
daysOfWeek[5] = true
ar.updateRecAlarmStatus(daysOfWeekArr, alarmId);
实体Class:(AlarmEntity.java)
@Entity(tableName = "alarm_table")
public class AlarmEntity {
// ID used to disable / enable / delete alarms
@PrimaryKey
private int mAlarmId;
// Trigger time for alarm
private long mAlarmTime;
private boolean mAlarmEnabled;
@TypeConverters({Converter.class})
private Boolean[] mDaysOfWeekArr;
......
...... }
类型转换器
public class Converter {
// Used by AlarmEntity Boolean[] mDaysOfWeek
@TypeConverter
public static Boolean[] fromString(String value) {
Type listType = new TypeToken<Boolean[]>() {
}.getType();
Log.e("Converter: ", "fromString Called");
return new Gson().fromJson(value, listType);
}
@TypeConverter
public static String fromBoolean(Boolean[] list) {
Gson gson = new Gson();
Log.e("Converter: ", "fromString Called");
return gson.toJson(list);
}
}
这是我第一次在Whosebug上提问..请问是否需要更多info/code
编辑:
从数据库中获取一个 alarmEntity 对象并修改其值后
我可以使用内置的@Update 查询
保存更改
但是这个查询不起作用...我确定下面 SET mDaysOfWeekArr=:daysOfWeekArr
是错误的,但我不知道如何解决它
@TypeConverters({Converter.class})
@Query("UPDATE alarm_table SET mDaysOfWeekArr=:daysOfWeekArr WHERE mAlarmId=:alarmId")
void updateRecAlarmStatus(Boolean[] daysOfWeekArr, int alarmId);
mDaysOfWeekArr
在 SQLite 中存储为 TEXT
,因此您不能用 Boolean[]
执行 UPDATE alarm_table SET mDaysOfWeekArr=:daysOfWeekArr WHERE mAlarmId=:alarmId
,因此会出现该错误。
我会将您的 Dao 方法更改为 void updateRecAlarmStatus(String daysOfWeekArr, int alarmId)
,并在调用此方法之前进行您的 JSON 转换。
编辑:当 Dao 方法具有 @Query
注释时,Room 似乎无法使用 TypeConverters
。
我正在尝试 更新 android 房间数据库中的一个布尔数组,但它抛出了这个错误
E/SQLiteLog: (1) near "?": syntax error in "UPDATE alarm_table SET mDaysOfWeekArr=?,?,?,?,?,?,?,? WHERE mAlarmId=?"
查询:(AlarmDao.java)
@TypeConverters({Converter.class})
@Query("UPDATE alarm_table SET mDaysOfWeekArr=:daysOfWeekArr WHERE mAlarmId=:alarmId")
void updateRecAlarmStatus(Boolean[] daysOfWeekArr, int alarmId);
插入/读取布尔数组时正确的值保存在数据库中(使用查询)
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(AlarmEntity alarmEntity);
房间数据库存储库(AlarmRepository.java)
public void updateRecAlarmStatus(final Boolean[] daysOfWeekArr, final int alarmId) {
databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
alarmDao.updateRecAlarmStatus(daysOfWeekArr, alarmId);
}
});
}
使用 recyclerView 中的 onClick 调用上述函数并使用 getter 和 Boolean[] 中的更改值从实体读取数据
daysOfWeek[1] = true;
daysOfWeek[5] = true
ar.updateRecAlarmStatus(daysOfWeekArr, alarmId);
实体Class:(AlarmEntity.java)
@Entity(tableName = "alarm_table")
public class AlarmEntity {
// ID used to disable / enable / delete alarms
@PrimaryKey
private int mAlarmId;
// Trigger time for alarm
private long mAlarmTime;
private boolean mAlarmEnabled;
@TypeConverters({Converter.class})
private Boolean[] mDaysOfWeekArr;
......
...... }
类型转换器
public class Converter {
// Used by AlarmEntity Boolean[] mDaysOfWeek
@TypeConverter
public static Boolean[] fromString(String value) {
Type listType = new TypeToken<Boolean[]>() {
}.getType();
Log.e("Converter: ", "fromString Called");
return new Gson().fromJson(value, listType);
}
@TypeConverter
public static String fromBoolean(Boolean[] list) {
Gson gson = new Gson();
Log.e("Converter: ", "fromString Called");
return gson.toJson(list);
}
}
这是我第一次在Whosebug上提问..请问是否需要更多info/code
编辑:
从数据库中获取一个 alarmEntity 对象并修改其值后 我可以使用内置的@Update 查询
保存更改但是这个查询不起作用...我确定下面 SET mDaysOfWeekArr=:daysOfWeekArr
是错误的,但我不知道如何解决它
@TypeConverters({Converter.class})
@Query("UPDATE alarm_table SET mDaysOfWeekArr=:daysOfWeekArr WHERE mAlarmId=:alarmId")
void updateRecAlarmStatus(Boolean[] daysOfWeekArr, int alarmId);
mDaysOfWeekArr
在 SQLite 中存储为 TEXT
,因此您不能用 Boolean[]
执行 UPDATE alarm_table SET mDaysOfWeekArr=:daysOfWeekArr WHERE mAlarmId=:alarmId
,因此会出现该错误。
我会将您的 Dao 方法更改为 void updateRecAlarmStatus(String daysOfWeekArr, int alarmId)
,并在调用此方法之前进行您的 JSON 转换。
编辑:当 Dao 方法具有 @Query
注释时,Room 似乎无法使用 TypeConverters
。