Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 与'合作;关联的';Firebase中的数据_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 与'合作;关联的';Firebase中的数据

Android 与'合作;关联的';Firebase中的数据,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我是Firebase数据库的新手,到目前为止一直在使用MySQL。我知道Firebase本身没有“关联”数据,但我认为我仍在尝试创建它,因为这就是我的思维方式!所以,我遇到的问题可能是因为我的数据格式不好——我希望有任何指针 在我的应用程序(使用Android Studio)中,每个用户都可以有多个框。每个框使用一个调色板(可以是默认调色板,也可以是用户定义的调色板)。调色板由许多颜色组成 目前,我的数据如下: Boxes BoxKey1 name: Test Box

我是Firebase数据库的新手,到目前为止一直在使用MySQL。我知道Firebase本身没有“关联”数据,但我认为我仍在尝试创建它,因为这就是我的思维方式!所以,我遇到的问题可能是因为我的数据格式不好——我希望有任何指针

在我的应用程序(使用Android Studio)中,每个用户都可以有多个框。每个框使用一个调色板(可以是默认调色板,也可以是用户定义的调色板)。调色板由许多颜色组成

目前,我的数据如下:

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 ...
public void initialiseBox(ValueEventListener listener) {
    if(this.key == null) return;
    DatabaseReference mBoxReference = FirebaseDatabase.getInstance().getReference()
            .child("boxes").child(this.key);
    mBoxReference.addListenerForSingleValueEvent(listener);
}
因此,我可以很容易地检索用户框列表,并列出所有名称。如果用户单击某个名称,则检索并显示具有该名称的框。我还需要显示使用的调色板(名称和它包含的颜色)

在“活动”中,我检索框,如下所示:

    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如下所示:

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 ...
public void initialiseBox(ValueEventListener listener) {
    if(this.key == null) return;
    DatabaseReference mBoxReference = FirebaseDatabase.getInstance().getReference()
            .child("boxes").child(this.key);
    mBoxReference.addListenerForSingleValueEvent(listener);
}
这很好,但现在我只从数据库中检索了调色板键和其他框数据。然后我如何得到实际的调色板,以及它的所有颜色,这样我也可以展示它们

我一直在尝试在主要活动中使用一种“嵌套侦听器”:

    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());

                 }
            });
        }
    });
但是它看起来非常笨拙,我不能完全让它工作(调色板没有填充,所以在paletteName.setText位我得到了一个错误)

这是正确的方法吗?如果没有,我应该怎么做?如果这是一个正确的想法,有人能看出我的错误吗?

Firebase(以及许多其他NoSQL数据库)中的相关数据几乎与SQL数据库中的数据一样常见。主要区别在于:

  • 在Firebase中,关系不是由DBMS为您管理的。这意味着您需要编写自己的代码(可能还有服务器端安全规则),以确保关系保持正常
  • 您经常会在Firebase中复制一些数据,这减少了查找的需要。但是这是以在写期间需要复制数据为代价的,你需要考虑。
  • 您所做的就是所谓的客户端连接,它确实是将不同顶级节点的数据获取到应用程序中的一种有效方法

    使用嵌套侦听器是否是最好的方法取决于数据和用例。这里要考虑的事项:

  • 如果目标列表很短,您可能只想预加载整个列表,并消除嵌套联接的需要
  • 您需要从连接的项目中获得什么?如果它只是一个属性(例如调色板的名称),那么考虑是否值得在源下复制该属性,以消除嵌套连接的需要。
  • 嵌套代码将很快变得不可读。将侦听器拉入实用程序类,并使用更简单的接口调用它。 i、 您可能希望集中错误处理,这在helper类中是完全可以做到的。这就给您留下了一个回调方法,可以在Java8中对其进行lambdafied,从而使其更易于阅读
  • 我经常建议您在Firebase中为应用程序的屏幕建模。因此,如果你的应用程序有一个用户名列表,那么在你的数据库中建立一个用户名列表模型。现在,您还将框ID嵌套在该列表下,这意味着您将加载所有用户的框ID,只是为了显示他们的姓名
  • 我强烈推荐阅读和观看