gpt4 book ai didi

android - greenDAO 字符串长度约束

转载 作者:行者123 更新时间:2023-11-29 00:25:28 33 4
gpt4 key购买 nike

我正在尝试使用 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 does not enforce the length of a VARCHAR. You can declare a VARCHAR(10) and SQLite will be happy to let you put 500 characters in it. And it will keep all 500 characters intact - it never truncates." from SQLite FAQ



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

最佳答案

我认为没有计划在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 方法以包含您的条件。这样旁路就关闭了(尽管还有其他可能绕过它)。

关于android - greenDAO 字符串长度约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19972169/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com