我对Firebase数据库相对较新,直到现在才使用MySQL。我知道Firebase中没有“关联”数据,但我认为我仍然在尝试创建它,因为这就是我的思维方式!所以,我可能遇到的问题是因为我的数据格式很糟糕 - 我很感激任何指针。
在我的应用中(使用Android Studio),每个用户都可以拥有多个Box。每个Box使用单个调色板(可以是默认调色板,也可以是用户定义的调色板)。调色板由许多颜色组成。
目前,我的数据是这样的:
Boxes
BoxKey1
name: Test Box
paletteKey: paletteKey1
belongsTo: userKey1
BoxKey2
... etc ...
Colours
ColourKey1
name: Red
hexCode: ff0000
ColourKey2
name: Blue
... etc ...
Palettes
PaletteKey1
name: default
colours
ColourKey1: true
ColourKey7: true
... etc ...
PaletteKey2
... etc ...
Users
UserKey1
name: Joe Bloggs
boxes
BoxKey1: true
BoxKey5: true
... etc ...
因此,我可以轻松地检索用户Box的列表,并列出所有名称。如果用户单击名称,则会检索并显示具有该名称的Box。我还需要显示使用的Palette(它包含的名称和颜色)。
在活动中,我按如下方式检索Box:
mBox.setKey(boxKey);
mBox.initialiseBox(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
mBox = dataSnapshot.getValue(Box.class);
boxName.setText(mBox.getName()); // Show Box name
// AT THIS POINT I HAVE THE BOX DETAILS, BUT I NEED THE PALETTE DETAILS TOO
}
});
在Box类中,initialiseBox如下所示:
public void initialiseBox(ValueEventListener listener) {
if(this.key == null) return;
DatabaseReference mBoxReference = FirebaseDatabase.getInstance().getReference()
.child("boxes").child(this.key);
mBoxReference.addListenerForSingleValueEvent(listener);
}
这工作正常,但此时我只从数据库中检索了Palette键以及其他Box数据。然后我如何得到实际的调色板及其所有颜色,所以我也可以显示它们?
我一直在尝试在主要活动中像这样做一种'嵌套式监听器':
mBox.initialiseBox(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Same as before
mBox = dataSnapshot.getValue(Box.class);
boxName.setText(mBox.getName()); // Show Box name
// Now add a new listener for the Palette
mPalette.setKey(mBox.getPaletteKey());
mPalette.initialisePalette(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
mPalette = dataSnapshot.getValue(Palette.class);
paletteName.setText(mPalette.getName());
}
});
}
});
但它似乎非常笨拙,而且我不能完全使用它(Palette没有填充,所以在paletteName.setText位我得到一个错误。)
这是正确的方法吗?如果没有,我该怎么办?如果这是正确的想法,谁能看到我出错的地方?
答案 0 :(得分:1)
Firebase(以及许多其他NoSQL数据库)中的相关数据几乎与SQL数据库中的相同。主要区别是:
您正在做的事情称为客户端连接,这确实是将不同顶级节点的数据导入您的应用程序的有效方法。
使用嵌套侦听器执行此操作是否最佳方法取决于数据和用例。这里要考虑的事情:
我强烈建议您阅读NoSQL data modeling并观看Firebase for SQL developers。