greenDAO字符串长度约束

时间:2013-11-14 07:41:46

标签: android sqlite greendao

我正在尝试使用greenDAO对我的数据库模型中的字符串长度施加一定的限制。我猜想会存在这样的事情:

protected void addProperties(Schema inSchema, Entity inEntity) {
        inEntity.addIdProperty();
        inEntity.addStringProperty("description").notNull().maxLength(42);
    }

我的第一个猜测是改变生成的DAO类(为了另一个目的描述here),如下所示:

public static void createTable(SQLiteDatabase db, boolean ifNotExists) {
    String constraint = ifNotExists? "IF NOT EXISTS ": "";
    db.execSQL("CREATE TABLE " + constraint + "'TEST' (" + //
           "'_id' INTEGER PRIMARY KEY ," + 
           "'DESCRIPTION' VARCHAR(42) NOT NULL );");
}

然后我发现SQLite本身甚至不支持字符串的限制:

  

“SQLite不强制使用VARCHAR的长度。你可以声明一个VARCHAR(10),SQLite很乐意让你输入500个字符。它将保持所有500个字符的完整性 - 它永远不会被截断。”来自SQLite FAQ



我能想到的唯一(丑陋)解决方案是为DAO-Object编写另一个包装器。所以我的问题是:对于我想要实现的目标是否有任何优雅的解决方案和/或是否有任何计划将其纳入未来的greenDAO版本?

2 个答案:

答案 0 :(得分:1)

我认为没有计划将这些限制纳入greendao。 因此,最优雅的解决方案是为greendao编写一个功能。这样,您可以将约束定义放在它所属的位置:您的(greendao-)架构。

您必须修改de.greenrobot.daogenerator.Property并添加以下内容:

private Integer textLength = null;

public static class PropertyBuilder {
    ...
    public PropertyBuilder length(int length) {
        if (property.propertyType != PropertyType.String) {
            throw new RuntimeException("This is only supported for text!");
        }
        if (length <= 0) {
            throw new IllegalArgumentException();
        }
        property.textLength = length;
        return this;
    }
}

然后你可以检查在实体上设置的字符串是否与你的约束匹配,并通过修改entity.ftl在相应的setter上抛出异常,以便setter包含你的条件。 这可以通过在实体中添加保留部分中的新方法来绕过。

您的第二个选择是修改dao.ftl bindValues - 方法以包含您的病情。通过这种方式关闭旁路(虽然还有其他可能绕过这个)。

答案 1 :(得分:1)

感谢您的建议并抱歉没有回答。我最终为DAO-Objects实现了一个包装类,毕竟这不是一个坏主意。 如下图所示,Activity可以实例化一个特定的数据库服务,该服务使用DAO-Object来改变数据库的内容。该服务提供符合业务逻辑的方法,从而在数据写入数据库之前验证数据。

Activity not using the DAO-Object directly but by an interposed Database-Service