我目前正在尝试使用包含(字节数组)属性的 where 条件的查询来选择条目。此属性/列包含一个序列化的 UUID。不幸的是,我目前无法更改此列的数据类型,因为数据库是由单独的模块创建和同步的,该模块仅适用于当前实现。由于 greenDao 无法正确处理字节数组作为主键,我正试图以某种方式解决这个问题。创建我自己的选择查询等将是一个解决方案该属性在 greenDAO 生成期间定义为:
Entity randomEntity = schema.addEntity("RandomEntity");
...
randomEntity.addByteArrayProperty("RandomProperty");
查询是使用以下行构建的:
Query query = this.mRandomEntityDao.queryBuilder().where(RandomEntityDao.Properties.RandomProperty.eq(randomByteArray)).build();
不幸的是,此操作出现以下错误:
de.greenrobot.dao.DaoException: Illegal value: found array, but simple object required
at de.greenrobot.dao.query.WhereCondition$PropertyCondition.checkValueForType(WhereCondition.java:75)
...
这是greenDAO根本不支持条件还是我错过了一些重要的东西?不幸的是,我不能为这个特定属性使用其他数据类型。
编辑:
我当前的解决方法如下:
由于 greenDao 可以处理作为字符串的主键(直到某个点)并且 UUID 也可以用这种数据类型表示,所以我更改了现有表并添加了以下列:
db.execSQL("ALTER TABLE 'RANDOMTABLE' ADD COLUMN '_GREENID' TEXT;");
同步模块忽略此列,因此不应该有任何问题。然后我创建了一个触发器,将列中的序列化 UUID 映射ID
到新_GREENID
列:
db.execSQL("CREATE TRIGGER randomtableGreen AFTER INSERT ON 'RANDOMTABLE' BEGIN " +
"UPDATE 'RANDOMTABLE' SET '_GREENID' = HEX(NEW.ID) WHERE 'RANDOMTABLE'.ID = NEW.ID; " +
"END;");
最后,我在表上运行更新,以防它们在创建触发器之前已经包含一些条目:
db.execSQL("UPDATE 'RANDOMTABLE' SET '_GREENID' = HEX(ID) WHERE '_GREENID' <> '';");