在 Android 上使用 ORMLite 4.48,考虑以下用户表...
@DatabaseTable(tableName = "users")
public class User {
@DatabaseField(columnName = Column.UUID)
protected String uuid;
@DatabaseField(columnName = Column.FIRST_NAME)
protected String firstName = null;
@DatabaseField(columnName = Column.LAST_NAME)
protected String lastName = null;
@DatabaseField(columnName = Column.ADDRESS, dataType = DataType.SERIALIZABLE)
protected Address address = null;
// ...
}
(地址类表示人类可读的地址,从纬度/经度转换而来)
...使用以下查询...
List<User> users = getDbHelper().getDao(User.class)
.queryBuilder()
.where()
.isNotNull(User.Column.ADDRESS)
.query();
...抛出此异常:
java.sql.SQLException: Field 'address' is of data type com.j256.ormlite.field.types.SerializableType@42ac7650 which can not be compared
at com.j256.ormlite.stmt.query.BaseComparison.<init>(BaseComparison.java:27)
at com.j256.ormlite.stmt.query.IsNotNull.<init>(IsNotNull.java:19)
at com.j256.ormlite.stmt.Where.isNotNull(Where.java:315)
...
显然,IS NOT NULL
子句不能用于存储为 DataType.SERIALIZABLE 的字段。
深入研究 ORMLite 代码,BaseComparison 构造函数检查 fieldType 是否具有可比性:
protected BaseComparison(String columnName, FieldType fieldType, Object value, boolean isComparison)
throws SQLException {
if (isComparison && fieldType != null && !fieldType.isComparable()) {
throw new SQLException("Field '" + columnName + "' is of data type " + fieldType.getDataPersister()
+ " which can not be compared");
}
...
}
显然,SerializableType.isComparable()
返回 false
:
@Override
public boolean isComparable() {
return false;
}
所以,我很清楚为什么会抛出异常。但为什么不能执行 Where.isNull()
或 Where.isNotNull()
?这是 SQLite 的限制还是 ORMLite 的作者做出了这个决定?
最佳答案
不确定“为什么”,但我相信“如何”是使用 ForeignCollectionField
而不是 DatabaseField
关于java - 为什么不能对 ormlite 中具有 DataType.SERIALIZABLE 的列执行 isNotNull?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26401154/