2015-11-29 5 views
7

私はAndroidアプリにRealmを追加しようとしています。彼らの文書はかなりよく説明されています&簡単に説明します。しかし、この1つの特定の領域を説明することはできません。私は@Ignoreアノテーションの実用的な使い方を理解することができません。私はこの注釈の下のフィールドは永続しないことを知っています。@IgnoreをRealmで実用するには?

いくつかのユースケースを共有していただけますか?また、私はそのような分野の範囲を知りたがっていました。つまり、@Ignoreフィールドをある値に設定すると、その特定の起動セッションのために、その値が他のクラスのアプリケーションで使用できるかどうかを知ることができます。はいの場合は、どうすればアクセスできますか?いいえ(私がそうだと思います)なら、どうしてこのようなフィールドが必要なのでしょうか?

私はこことウェブで検索しましたが、関連情報が見つかりませんでした。もし私の無知から、私はいくつかのリソースに逃した、私にそれを案内してください。

ありがとうございました。

答えて

8

したがって公式ドキュメントに@ignoreが2つの場合に便利です(https://realm.io/docs/java/latest/を参照してください):

  1. するときは、GSON統合を使用して、JSONはまだあなたを保存したいよりも多くのデータが含まれていますが、それを解析し、直後に使用したいと考えています。

  2. RealmObjectを拡張しているクラスでカスタムゲッターとセッターを作成することはできません。これらはオーバーライドされるためです。とにかくカスタムロジックを使用したい場合、Realmはgetter &セッターをオーバーライドしないので、無視されたフィールドはハックとして使用できます。例:

    package io.realm.entities; 
    
    import io.realm.RealmObject; 
    import io.realm.annotations.Ignore; 
    
    public class StringOnly extends RealmObject { 
    
        private String name; 
    
        @Ignore 
        private String kingName; 
    
        // custom setter 
        public void setKingName(String kingName) { setName("King " + kingName); } 
    
        // custom getter 
        public String getKingName() { return getName(); } 
    
        // setter and getter for 'name' 
    } 
    

無視されたフィールドは、彼らだけが(Javaで通常のオブジェクトと同じ)に設定されたオブジェクトからアクセスできます。

UPDATE: @ The-nullポインタがコメント内で指摘されているため、2番目の点は古くなっています。 Realmでは、Realmモデルでカスタムゲッタとセッタを使用できるようになりました。ここで

+0

お返事ありがとうございます。この例はかなり役に立ちました。レルムは、カスタム・メソッドに – Anjani

+1

第二の点は、期限が切れています完全に無関係です。 –

3

は、実世界のユースケースのカップルです:

1 - ユーザーのフルネームを取得します:

public class User extends RealmObject { 

private String first; 
private String last; 

@Ignore 
private String fullName; 

public String getFullName() { 
    return getFirst() + " " + getLast(); 
} 

は、オブジェクトのJSON表現を取得します。

public class User extends RealmObject { 

private String first; 
private String last; 

@Ignore 
private JSONObject Json; 

public JSONObject getJson() { 
    try { 
     JSONObject dict = new JSONObject(); 

     dict.put("first", getFirst()); 
     dict.put("last", getLast()); 
     return dict; 
    } catch (JSONException e) { 
     // log the exception 
    } 

    return null; 
} 
+1

'getFullName()'と 'getJson()'リターン計算した値ではなく、それらを作る '@ Ignore'注釈付きフィールドの内容の両方を定義することができますよう – Flawyte

0

についてofficial documentationを参照してください。 @Ignore注釈:

注釈@Ignoreは、フィールドをディスクに永続化しないでください。無視されたフィールドは、入力にモデルよりも多くのフィールドが含まれていて、未使用のデータフィールドを処理するための特殊なケースがたくさんある場合は便利です。

1

質問しているときにフィールド名を定義すると便利です。例えば、

ユーザー。Javaの

public class User extends RealmObject { 
    @Index 
    public String name; 

    @Ignore 
    public static final String NAME = "name"; 
} 

そして、私はのような何かを行うことができますに、後:idname言うからスキーマが変更された場合

realm.where(User.class).equalTo(User.NAME, "John").findFirst();

をこのように私はすべての発生を追い詰める必要はありません"name"

+0

これは、私が言わなければならないことは、非常に知的なことです。 – Anjani

+0

'static'フィールドはRealmに保存されないので、' @ Ignore'アノテーションはこの場合役に立たない。 – Flawyte

+0

@quidproquoこのライブラリを見てくださいhttps://github.com/cmelchior/realmfieldnameshelperそれはあなたのフィールド名を生成します – skywall

関連する問題