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 FAQから



私が思いついた唯一の (醜い) 解決策は、DAO-Object 用の別のラッパーを作成することでした。だから私の質問は: 私がアーカイブしようとしているものに対するエレガントな解決策はありますか、そして/または greenDAO の将来のリリースにそれを含める計画はありますか?

4

2 に答える 2

1

ご提案いただきありがとうございます。回答できなくて申し訳ありません。結局、DAO オブジェクトのラッパー クラスを実装することになりましたが、これはそれほど悪い考えではありませんでした。以下に示すように、アクティビティは、DAO オブジェクトを使用してデータベースのコンテンツを変更する特定のデータベース サービスをインスタンス化できます。このサービスは、ビジネス ロジックに準拠するメソッドを提供するため、データベースに書き込まれる前にデータを検証します。

DAO-Object を直接使用するのではなく、介在する Database-Service を使用するアクティビティ

于 2014-03-26T19:06:53.720 に答える
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し、セッターに条件が含まれるように変更して、対応するセッターで例外をスローすることができます。これは、キープ セクションに新しいメソッドをエンティティに追加することで回避できます。

2 番目のオプションは、条件を含めるように -method を変更dao.ftlすることです。bindValuesこのようにして、バイパスが閉じられます (ただし、これをバイパスする可能性は他にもあります)。

于 2013-11-14T21:06:10.367 に答える