关于字节[]又名在greendao BLOB:
看着de.greenrobot.dao.query.WhereCondition.PropertyCondition.checkValueForType条件01目前不支持,因为如果值的类型为byte[],以下几行将始终引发异常。
if (value != null && value.getClass().isArray()) {
throw new DaoException("Illegal value: found array, but simple object required");
}
解决方案1 - 修改并有助于greendao:
您可以修改UPER线,使异常仅抛出,如果值的类型与属性的类型不适合。
if (value != null) {
if (value.getClass().isArray() && !property.type.isArray()) {
throw new DaoException("Illegal value: found array, but " +
"simple object required");
}
if (!value.getClass().isArray() && property.type.isArray()) {
throw new DaoException("Illegal value: found simple object, " +
"but array required");
}
}
也许这将已经解决的问题,但有可能是其他地区greendao停止与此编辑工作或将打破查询。例如,参数与查询的绑定可能不适用于数组。
Solutinon 2 - 使用queryRaw(String where, String... selectionArg)
这是非常简单的,不应该与有关SQLite的一些认识问题。
解决方案3 - 使用查找表
假设原始表:
ORIG
-------------------------------
UUID BLOB
...
可以修改ORIG并添加一个自动增量-的PrimaryKey:
db.execSQL("ALTER TABLE 'ORIG' " +
"ADD COLUMN 'REF_ID' INT PRIMARYKEY AUTOINCREMENT;");
同步服务应该已经关注ORIG.UUID的独特性并忽略新的ORIG.REF_ID -column。为了插入新的UUID,同步服务可能会使用INSERT在ORIG.REF_ID中导致新的自动增量值。 对于更新现有的UUID,同步服务可能会使用UPDATE ... WHERE UUID=?,并且不会创建任何新的ORIG.REF_ID值,但旧值将保留。
总结了ORIG -table在列REF_ID和列UUID之间有一个新的双射。
现在,您可以创建另一个表:
ORIG_IDX
------------------------------
UUID TEXT PRIMARYKEY
REF_ID INT UNIQUE
(如果你的数据是小于8个字节,也将适用于一个INT代替TEXT,但我不知道是否有一个内置的从BLOB到INT。)
ORIG.IDX.UUID将是字符串表示ORIG.UUID。 ORIG_IDX.REF_ID是ORIG.REF_ID的外键。
ORIG_IDX填充和更新触发器:
db.execSQL("CREATE TRIGGER T_ORIG_AI AFTER INSERT ON 'ORIG' BEGIN " +
"INSERT 'ORIG_IDX' SET 'REF_ID' = NEW.REF_ID, 'UUID' = NEW.UUID" +
"END;");
创建相应的触发器,UPDATE和DELETE。
可以使用greendao创建表ORIG和ORIG_IDX然后查询请求的UUID与:
public Orig getOrig(String uuid) {
OrigIdx origIdx = OrigIdxDao.queryBuilder().where(
QrigIdxDao.Properties.UUID.eq(uuid)).unique();
if (origIdx != null) {
return origIdx.getOrig();
}
return null;
}
我觉得字符串的PrimaryKey尚不支持,所以dao.load(uuid)将不可用。
CONCERING AN扩展表:
你可以使用一个string的PrimaryKey列,并提供在实体的保部分转换的方法。在插入之前,您将必须计算主键列。
如果还有其他工具插入数据(例如您的同步服务),您必须在插入前使用触发器计算您的主键。这似乎不可能使用SQLite。因此,主键约束将在同步服务插入时失败,因此此解决方案不适用于主键!