2

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

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

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

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 常见问题解答



我能想出的唯一(丑陋的)解决方案是为 DAO-Object 编写另一个包装器。所以我的问题是:对于我正在尝试归档的内容是否有任何优雅的解决方案和/或是否有任何计划将其包含在 greenDAO 的未来版本中?

4

2 回答 2

1

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

您必须修改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以便设置器包含您的条件。这可以通过在实体的保留部分中添加新方法来绕过。

您的第二个选择是修改-method 以包含您的条件dao.ftlbindValues这样旁路就关闭了(尽管还有其他可能绕过它)。

于 2013-11-14T21:06:10.367 回答
1

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

活动不直接使用 DAO 对象,而是通过插入的数据库服务

于 2014-03-26T19:06:53.720 回答