2017-11-18 17 views
0

下の画像で子供のノードの名前を変更するにはどうすればよいですか? questions_statsList<Integer>です。これはリストなので、ノードIDとして整数を取得することがわかります。私は0から1000までの数字でランダムに子をそれぞれ作成します。私はこのIDをオブジェクトの一部として設定し、リストをループして探します。私が望むのは、私がそれを作成する瞬間にオブジェクトのキーとして "0671"を設定することです。Firebaseデータベースの変更ノードID

Stringを定義するIDを持つ各子にアクセスするには、オブジェクトをどのように定義する必要がありますか。

questions_statsのそれぞれが対象です。

これは私のUserProfileクラスの定義です。

public class UserProfile implements Parcelable { 
    private List<Integer> questions_list; 
    private List<QuestionsStats> questions_stats; 
    private String country_name, share_code, user_name; 
    private int token_count; 
    private Boolean is_guest; 

    public UserProfile() { 
    } 

    public UserProfile(List<Integer> questions_list, List<QuestionsStats> questions_stats, String country_name, String share_code, String user_name, int token_count, Boolean is_guest) { 
     this.questions_list = questions_list; 
     this.questions_stats = questions_stats; 
     this.country_name = country_name; 
     this.share_code = share_code; 
     this.user_name = user_name; 
     this.token_count = token_count; 
     this.is_guest = is_guest; 
    } 
} 

個別にchild("0159").setValue(QuestionStats)を使用して設定できます。

しかし、私の目的のために、私は「ユーザー」全体としてのデータを取得し、それが一覧であるようquestions_stats whithin反復処理する必要があります。

私が望むことを達成するために、自分のUserProfileクラスをどのように定義すればよいですか?

誰でも私にヒントを与えることができますか?

Sample

+0

「0000」と「0001」の内部のデータも欲しいですか? –

+0

@Peter Haddad questions_statsは、リスト0と1がインデックスなので、オブジェクトのリストです。私が望むのは、 "0001"や "8760"のようなキーを特定のオブジェクトに設定し、リストの代わりにmapsとしてquestion_statsにアクセスできるようにすることです。私は4つのループを使ってリスト内の特定のオブジェクトにアクセスすることができますが、マップを使用すると効率が向上します。マップの実装方法がわからない – Racu

+0

'Firebase'データベースはNoSQLデータベースで、キーとベールのペアとして構成されています。つまり、データベース内のすべてのノードが' Map'です。あなたのデータベースのスクリーンショットを見ると、 'question_stats'は' Map'でもあり、 'question_stats'をキーとし、その下のデータを値として持っています。 '0'ノードはキーである' 0'とその値の下のデータであるマップです。等々。あなたのモデルクラスにリストがあることを混同しないでください。データベースの中には、すべてのノードが 'Map'です。 –

答えて

0

はおそらく、私が代わりに「変更」のノードIDを「設定」する方法を求めているはずです 私は何を持っていることはList<QuestionsStats>ですが、キーとしてインデックスを取得List<QuestionsStats>を使用しているとき、私が欲しいのは同じことをすることですList<QuestionsStats>インデックスの代わりに、各アイテムのストリングキー。 私のリストをMap<String, QuestionsStats>に変更しました。今、難しい部分は、Objectを梱包するときです。あなたが@デビッドワッサーでこの答えでhereを示すように区分けする​​またはwriteMap()を使用することができますが、それは警告与える:

を代わりにwriteBundle(バンドル)を使用してください。マップを現在のdataPosition()で パーセルにフラット化し、必要に応じてdataCapacity()を増やします。 マップキーはStringオブジェクトでなければなりません。マップ値は、 writeValue(Object)を使用して記述されており、そこの指定に従わなければなりません。この メソッドの代わりにwriteBundle(Bundle)を使用することを強くお勧めします。 は、 をマーシャリングの時点で避けることができるタイプセーフなAPIをBundleクラスが提供するためです。私はこのコードを使用してparceled This Questionのコメントの助けを借りて、だから、

、私は誰かがそれが役立つか、その上の任意のコメントを持っている場合にはコメントし、「簡単な」方法を残していることに注意してください:

protected UserProfile(Parcel in) { 
//  in.readMap(myMap, Object.class.getClassLoader()); 
     myMap = new HashMap<>(); 
     String[] array = in.createStringArray(); 
     Bundle bundle = in.readBundle(Object.class.getClassLoader()); 
     for (String s : array) { 
      myMap.put(s, (Object) bundle.getParcelable(s)); 
     } 
    } 


    @Override 
    public void writeToParcel(Parcel dest, int flags) { 


    //  dest.writeMap(myMap); 
      Bundle bundle = new Bundle(); 
      for (Map.Entry<String, Object> entry : myMap.entrySet()) { 
       bundle.putParcelable(entry.getKey(), entry.getValue()); 
      } 
      Set<String> keySet = myMap.keySet(); 
      String[] array = keySet.toArray(new String[keySet.size()]); 
      dest.writeStringArray(array); 
      dest.writeBundle(bundle); 
     } 

なぜ私のリストには10​​0個未満のアイテムが含まれていますが、1000個まで成長することができます。私はプロではありませんが、私がアイテムのキーを既に知っていれば興味を持っているのは、それを見つけるためにリストを反復する必要があるよりも常に良いでしょう。最後に私の主な問題はMapの使用でした、私はハウツーを知らなかった。

0

How can I change the node names of my children in the image below?

回答:あなたはFirebaseデータベースからのノードの名前を変更することが可能なno wayがあります。そのためのAPIはありません。代わりに、そのノードにリスナーを接続してdataSnapshotオブジェクトを取得することができます。そのデータがあれば、他の名前を使って別の場所に書き込むことができます。単に名前を変更することはできませんfrom 0 to 00001 to 0001など。

+0

Map を使って名前を設定する方法があると思います。私は自分のモデルでそれをどのように実装するのか分かりません。名前を変更したくない場合は、「ユーザー」を更新するときにキー(ノード名)を設定します。 – Racu

+0

'Map 'を使っていても、単純にノードの名前を変更することはできません。これはあなたのモデルに関するものではなく、ノードの名前を変更するためのツールを提供していないFirebaseに関するものです。キー(ノードキー)を設定する場合は、そのキーを更新することを意味しますが、これはFirebaseでは不可能です。あなたがこれを達成することができる単一の方法は、私が上で教えた通りです。現在の場所からデータを取得し、別の名前を使用して別の場所に書き込んだり、古い場所からレコードを削除したりします。 –

+0

は、questions_statsがListであるため、ノードIDがインデックスであるため、名前を変更したくありません。私が望むのは、最初にノードを作成して文字列で名前を付けるので、後でコンテンツに変更を加えるためにアクセスできるということです。私がそれを作成したら、名前を変更する必要はありません。 私はユーザー全体を操作してデータを操作し、更新します。私はそれがForループで動作することができますが、効率的だとは思いません。 – Racu