Firebase数据库更改节点ID

Firebase数据库更改节点ID

问题描述:

如何在下图中更改我的孩子的节点名称? questions_statsList<Integer>,我知道我得到整数作为节点Id,因为这是一个列表。我使用0到1000之间的数字随机创建每个孩子。我将此ID设置为对象的一部分,并找到它我循环显示列表。我想要的是将“0671”设置为创建对象的关键点。Firebase数据库更改节点ID

我应该如何定义我的对象以便通过我定义为字符串的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)来设置它们。

但我的目的,我需要检索“用户”作为一个整体的数据,然后遍历whithin questions_stats像是一个列表。

我应该如何定义我的UserProfile类以实现我想要的功能?

有人可以给我一个提示吗?

Sample

+0

你想要'0000'和'0001'里面的数据吗? –

+0

@Peter Haddad questions_stats是对象列表,因为是列表0和1是索引。我想要的是能够设置一个像“0001”或“8760”这样的关键字来指定一个特定的对象,并以maps的形式访问questions_stats而不是列表。我可以通过使用四个循环来访问列表中的特定对象,但使用Map会使它更有效率,我相信。不知道如何实现地图。 – Racu

+0

'Firebase'数据库是一个NoSQL数据库,它被构造成密钥和veales对,这意味着数据库中的每个节点都是'Map'。看到你的数据库截图,'question_stats'也是一个'Map',它具有'question_stats'作为一个关键字和数据作为一个值。 '0'节点也是一个映射,其中'0'作为关键字,并将其下的数据作为值。等等。不要混淆你在你的模型类中有一个列表。在数据库内部,每个节点都是一个“Map”。 –

也许我应该问如何“设置”,而不是“改变”节点ID 我所拥有的是一个List<QuestionsStats>,但使用List<QuestionsStats>你的索引作为密钥时,我想是有相同的List<QuestionsStats>而不是索引,我的每个项目的字符串键。 所以我改变了我的名单Map<String, QuestionsStats>。现在棘手的部分是当打包Object时。您可以使用​​writeMap()到包裹如本答案由@大卫瓦瑟here,但它给出了一个警告:

请使用writeBundle(束)来代替。在当前的dataPosition()处将Map映射到地块 ,如果需要,则增大dataCapacity()。 Map键必须是String对象。映射值使用 writeValue(Object)编写,并且必须遵循该规范。因为Bundle类提供了一个类型安全的API,允许您在编组时使用 来避免神秘的类型错误,所以强烈建议使用writeBundle(Bundle)而不是 方法,因为它是 。

与我瓜分使用此代码,在 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); 
     } 

为什么我想要这个,那么目前我的清单中包含的项目少于100个,但它可能会增长到1000个,我不是Pro,但我相信如果我已经知道该项目的关键感兴趣的人总是比不得不迭代列表来找到它更好。最后,我的主要问题是使用Map,我不知道如何。

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

答:有no way在其中您可以从您的火力地堡数据库更改节点的名称。没有这样做的API。你可以做的是在该节点上附加一个监听器,并获取dataSnapshot对象。有了这些数据,你可以使用其他名称在另一个地方写它。你不能简单地重命名它们from 0 to 0000,1 to 0001等等。

+0

我相信有一种方法使用Map 来设置名称。我只是不知道如何在我的模型中实现它。不想重命名,我想在更新我的“用户”时设置密钥(节点名称)。 – Racu

+0

即使使用“Map ”,也不能简单地更改节点的名称。这不是关于你的模型,它是关于Firebase,它没有提供任何允许你重命名节点的工具。当您想要设置密钥(节点密钥)时,这意味着您想要更新该密钥,这在Firebase中是不可能的。你可以通过单一的方式来实现这一点,正如我上面所做的那样。从当前位置获取数据,使用其他名称将其写入另一个位置,从旧位置删除记录。 –

+0

不想重命名,因为它的节点ID是一个索引,因为questions_stats是一个List。我想要的是,我第一次创建一个名为节点的名为节点的字符串,以便稍后可以访问它来修改它的内容。一旦我创建它,我不需要重命名它。 我检索用户作为一个整体操纵其数据并更新它。我可以像For循环一样工作,但我不相信它是有效的。 – Racu