展平Firebase中的数据以反映Android应用中的模型

时间:2016-12-27 01:22:10

标签: android firebase firebase-realtime-database nosql

我正在尝试使用Firebase作为我创建的原型应用程序的后端。

作为一个模型,即时创建假游戏。 数据非常简单:

  • 所有用户共有3个“级别”列表,按难度组织(简单,中等难度)。 (这些位于Fragment
  • 内的ViewPager
  • 每个级别都有迷你游戏,而不是用户完成。
  • 在Android应用中,用户会看到该列表,但也会看到他/她已完成该级别的迷你游戏的计数器。
  • 如果用户点击某个级别,他/她会看到迷你游戏列表并看到哪些已完成。

我目前按以下方式构建我的数据:

levels:{
   easy:{ 
    easy-level-1-id:{
        total-mini-games:10,
        easy-level-1-id:String
     }
   },
   medium:{....},
   hard:{.....}
}
user-progress:{
   user-id:{
      levels:{
        easy-level-1-id:{
           user-completed:int
        }
       },
       mini-games:{
          mini-game-1:true
          mini-game-2:true
       }
   }
}

我必须访问许多地方才能检查游戏是否已完成,或每个级别完成了多少游戏。 所有这些都是为了避免嵌套数据,正如文档所推荐的那样。

这样做是否更好,或者最好是在每个用户ID下存储每个可用级别,以便减少呼叫次数,但是有更多重复数据?

我知道Firebase小组提供的FirebaseRecyclerViewAdapter类,但因为它需要一个DatabaseReference对象作为知道数据位置的参数,所以这里并不真正适用,因为我提取构建列表模型时来自不同结构的数据。

mRef1.child(some_child).addValueEventListener(new ValueEventListener(){

     @Override
     public void onDataChange(DataSnapshot dataSnapshot){

          final Model model = dataSnapshot.getValue(Model.class);
          mRef2.child(some_other_child).addValueEventListener(new ValueEventListener(){

           @Override
           public void onDataChange(DataSnapshot dataSnapshot){

              //add more data into the model class
            .....
           }

           @Override
           public void onCancelled(DatabaseError databaseError){}


  });

  @Override
  public void onCancelled(DatabaseError databaseError){}

});

关于如何处理更多结构化数据的任何指示?

1 个答案:

答案 0 :(得分:4)

FirebaseUI包含对working with indexed data的支持。它可以从索引中加载链接数据,例如在mini-games节点中。

在您的示例中可以起作用:

keyRef = ref.child("user-progress").child(currentUser.getUid()).child("mini-games");
dataRef = ref.child("mini-games");
adapter = new FirebaseIndexRecyclerAdapter<Chat, MiniGameHolder>(
    MiniGame.class,
    android.R.layout.two_line_list_item,
    MiniGameHolder.class,
    keyRef, // The Firebase location containing the list of keys to be found in dataRef.
    dataRef) //The Firebase location to watch for data changes. Each key key found at keyRef's location represents a list item in the RecyclerView.