无法更新Room数据库中的布尔数组

问题描述

我正在尝试更新 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);

在插入/读取布尔数组时,正确的值将保存在db(使用查询)中

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(AlarmEntity alarmEntity);

Rb Db存储库(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);

实体类:(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;

......
...... }

TypeConverter

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);
    }

}

这是我第一次询问stackoverflow。请询问是否需要更多信息/代码

编辑:

从数据库中获取一个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,因此无法对UPDATE alarm_table SET mDaysOfWeekArr=:daysOfWeekArr WHERE mAlarmId=:alarmId进行Boolean[],因此会出现该错误。

我将您的Dao方法更改为void updateRecAlarmStatus(String daysOfWeekArr,int alarmId),并在调用此方法之前进行JSON转换。

编辑:而且当Dao方法具有TypeConverters注释时,Room似乎无法使用@Query

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...