首页 > 解决方案 > 无法更新房间数据库中的布尔数组

问题描述

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

房间数据库存储库(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;

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

类型转换器

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 .. 请询问是否需要更多信息/代码

编辑:

从 db 获取一个 alarmEntity 对象并修改其值后,我可以使用内置的 @Update 查询保存更改

但是这个查询不起作用......我确定下面 SET mDaysOfWeekArr=:daysOfWeekArr 是错误的,但我不知道如何解决它

    @TypeConverters({Converter.class})
    @Query("UPDATE alarm_table SET mDaysOfWeekArr=:daysOfWeekArr WHERE mAlarmId=:alarmId")
    void updateRecAlarmStatus(Boolean[] daysOfWeekArr, int alarmId);

标签: javaandroidandroid-roomdaoandroid-database

解决方案


mDaysOfWeekArr存储在TEXTSQLite 中,因此您不能UPDATE alarm_table SET mDaysOfWeekArr=:daysOfWeekArr WHERE mAlarmId=:alarmId使用 a 进行操作Boolean[],因此您会收到该错误。

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

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


推荐阅读