我正在尝试使用Firebase作为我创建的原型应用程序的后端。
作为一个模型,即时创建假游戏。 数据非常简单:
Fragment
ViewPager
我目前按以下方式构建我的数据:
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){}
});
关于如何处理更多结构化数据的任何指示?
答案 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.