【问题标题】:greenDAO String length constraintgreenDAO 字符串长度约束
【发布时间】:2013-11-14 07:41:46
【问题描述】:

我正在尝试使用 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 的未来版本中?

【问题讨论】:

  • 我相信您在自己实现字符串长度执行逻辑时遇到了困难。正如您在帖子中所说,sqlite 不会强制执行它,greenDAO 也不提供该功能。我会说你的解决方案是最好的选择。
  • 我建议您在 GreenDao 存储库中打开一个问题以建议此功能。

标签: android sqlite greendao


【解决方案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 在相应的设置器上引发异常,以便设置器包含您的条件。 这可以通过在实体的保留部分中添加新方法来绕过。

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

【讨论】:

  • 感谢您对GreenDao的洞察。虽然我没有实施您的建议(请参阅下面的答案),但我仍然会接受它,因为它承诺完全符合我最初的要求。不过我还是选择了包装类,因为它极大地有助于跟踪数据库操作并使它们可重用且具有某种语义。
【解决方案2】:

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

【讨论】:

  • 漂亮而优雅的解决方案。这样,如果需要,您甚至可以对多个表实施限制。但我会喜欢 greendao 的约束功能。也许以后再说。
猜你喜欢
  • 1970-01-01
  • 2012-05-10
  • 2021-09-19
  • 2018-05-03
  • 1970-01-01
  • 2020-08-03
  • 2021-07-09
  • 2020-02-08
  • 2017-11-25
相关资源
最近更新 更多