无法更新 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