我正在尝试使用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版本?
答案 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来改变数据库的内容。该服务提供符合业务逻辑的方法,从而在数据写入数据库之前验证数据。