16

Android アプリに ORMLite 4.42 を使用しています。私は外国のフィールドを持つエンティティを持っています。これらのフィールドには外部フィールドもあります。問題は、ルート エンティティの要素を取得すると、最初のレベルの外部フィールドのみが読み込まれることです。他のレベルは null です。

データベースでは、すべて問題ないようです。IDは正しいです。何か助けはありますか?

モデルで編集します


ID でクエリを実行すると、Equipment モデルは常に null になります。しかし、テーブル全体をクエリすると、すべてにアクセスできるようになります。

テーブルインシデント

@DatabaseField(generatedId=true)
private UUID id;
    
@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=false)
private UserEntity user;
    
@DatabaseField(dataType = DataType.DATE, canBeNull=true)
private Date date;
    
@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=true)
private EquipmentEntity equipment;

テーブル機器

@DatabaseField(generatedId=true)
private UUID id;
    
@DatabaseField(canBeNull=false, unique=true)
private String serial;
    
@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=false)
private EquipmentTypeEntity type;

テーブル機器タイプ

@DatabaseField(generatedId=true)
private UUID id;

@DatabaseField(canBeNull=true)
private String type;
    
@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=false)
private EquipmentModelEntity model;

テーブル機器モデル

@DatabaseField(generatedId=true)
private UUID id;
    
@DatabaseField(canBeNull=false)
private String model;
4

1 に答える 1

25

Android アプリに ORMLite 4.42 を使用しています。私は外国のフィールドを持つエンティティを持っています。これらのフィールドには外部フィールドもあります。問題は、ルート エンティティの要素を取得すると、最初のレベルの外部フィールドのみが読み込まれることです。他のレベルは null です。

そうですね、これは仕様です。 ORMLiteは、サブ要素を自動更新する回数を明確に制限します。これは、メモリを飲み込む巨大なオブジェクト ツリーや自己参照オブジェクトから保護するために行われました。

のドキュメントforeignAutoRefreshを引用するには:

注: 再帰を防ぐために、自動更新が制限されている場所がいくつかあります。foreignAutoRefresh が true に設定されたフィールドを持つクラスを自動更新する場合、または外部コレクションを持つクラスを自動更新する場合、どちらの場合も、結果のフィールドは null に設定され、自動更新されません。必要に応じて、いつでもフィールドで直接更新を呼び出すことができます。

注: 自動更新フィールドを持つオブジェクトである自動更新フィールドがある場合は、maxForeignAutoRefreshLevel 値を調整することをお勧めします。下記参照。

のドキュメントから引用するにはmaxForeignAutoRefreshLevel

これを使用して、外部オブジェクトを構成するレベルの最大数を設定できます。たとえば、最良の回答の外部フィールドを持つ質問があり、回答に対応する質問への外部フィールドがある場合、前後の構成が大きくなる可能性があります。これは、質問を検索するときに自動更新されたフィールドで特に問題になり、無限ループが発生する可能性があります。デフォルトでは、ORMLite は 2 レベルしか通過しませんが、レベルを 1 (0 は無効) に減らしたり、増やしたりすることができます。数値が高いほど、質問をロードするときに発生するデータベース トランザクションが多くなります。

をさらに大きくするmaxForeignAutoRefreshLevelと、要素を更新するために追加のクエリが発行されます。

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=true,
    maxForeignAutoRefreshLevel=3)
private EquipmentEntity equipment;
于 2013-01-22T19:09:06.740 に答える