web-dev-qa-db-ja.com

Android Room:@Ignore vs Transient

これら2つは、Roomデータベースエンティティのコンテキストで交換可能ですか、そうでない場合、それらの違いは何ですか?

15
Pavlus

@IgnoreはRoom固有のアノテーションであり、Roomはそのフィールドまたはメソッドを無視する必要があることを示しています。

transientはJava構文であり、次のことを示します このフィールドは標準でシリアル化しないでくださいJavaシリアル化 。- Roomhappensこれをデフォルトで@Ignoreと同様に扱う 。ほとんどの場合、これは継承している場合に存在しますたまたまtransientを使用するクラスから、そのクラスを制御していません(たとえば、ライブラリからのもの)。

独自のコードでJavaシリアライゼーションを使用していない場合、フィールドには@Ignoreを使用することをお勧めします。transientはメソッドで使用できるキーワードではありません。したがって、Roomに特定のコンストラクタを無視するように指示するには、@Ignoreを使用するしかありません。

18
CommonsWare

CommonsWareの回答に追加


CommonsWareが答えたように、transientはRoomのフィールドを無視するのに適したオプションではありません。同じモーダルを使用してサーバーからのデータを解析し、データベースに格納すると、ブロッカーが作成されます。

以下のようなモーダルクラスMyModal.Javaがあるとしましょう

public static class MyModal {

    @SerializedName(“intField”)
    public int intField;
    @SerializedName(“strField”)
    public String strField;
    @SerializedName(“booleanField”)
    public boolean booleanField;
}

BooleanFieldをデータベースに保存しない場合、およびそのフィールドを次のように変更した場合

  1. transient:データベースに保存している間はこのフィールドを無視しますが、サーバーからのデータを解析している間もこのフィールドを無視します。
  2. @Ignore:データベースにデータを挿入している間、このフィールドは無視されますが、このフィールドはJSON解析に参加します。
5
Pankaj Kumar