java - 为什么不能对 ormlite 中具有 DataType.SERIALIZABLE 的列执行 isNotNull?

标签 java android ormlite

在 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 是否具有可比性:

https://github.com/j256/ormlite-core/blob/master/src/main/java/com/j256/ormlite/stmt/query/BaseComparison.java

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:

https://github.com/j256/ormlite-core/blob/master/src/main/java/com/j256/ormlite/field/types/SerializableType.java

@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/

相关文章:

java - 无法使用 CQL 在 cassandra 中删除列

java - 使用代理记录 jmeter 请求不会创建采样器

android - 截取设备当前屏幕的屏幕截图

android - IllegalStateException:数据库未在第二个应用程序进入时打开,ORMLite

java - 简单的Java api来形成和发送ntp数据包

java - OSGi 和...?我用什么来控制包的加载/卸载/重新加载?

java - Android ksoap2 Web 服务获取 WSDL 的 XML 描述?

android - RuntimeException : API key not found. 检查 geo.API_KEY 是否在 AndroidManifest.xml 中

android - ormlite 读取日期为 'yyyy-MM-dd'

java - ORMLite 查询国外集合