【问题标题】:Cannot update Boolean Array in Room database无法更新房间数据库中的布尔数组
【发布时间】:2023-03-28 20:22:02
【问题描述】:

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

Room 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;

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

类型转换器

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

【问题讨论】:

    标签: java android android-room dao android-database


    【解决方案1】:

    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。

    【讨论】:

    • 类型转换器与@Query 一起使用
    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 2019-01-17
    • 2018-05-23
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多