无法从Firebase实时数据库中检索数据

时间:2017-06-19 10:33:53

标签: android firebase firebase-realtime-database

如果我给出了部件号,我正试图显示部件的“loc”。 这是数据结构的样子:

{
"parts":{
  "14521845": { "name":"TOOL EC160B/EC180B/EC210B/EC240", "loc":"EXC1", "sloc":"B3EGU01C03"},
  "12829050": { "name":"SWITCH; IGNITION SWITCH", "loc":"PS01", "sloc":"85-06-013"},
  "12829050": { "name":"SWITCH; IGNITION SWITCH", "loc":"COM1", "sloc":"B3RGK03D06"},
  "20044893": { "name":"PARTS CATALOG_ENG_SPA_FRE_GER_KOR_EC210D", "loc":"EXC1", "sloc":"B3EGT01B02"}
}
}

活动代码:

FirebaseDatabase firebaseDatabase=FirebaseDatabase.getInstance();
DatabaseReference databaseReference =firebaseDatabase.getReference("parts/"+curP);

            databaseReference.addChildEventListener(new ChildEventListener() {

                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                    Products data=dataSnapshot.getValue(Products.class);
                    Log.i("",String.valueOf(data.getLoc()));

                }

getLoc是Product类的getter函数,它返回给定curP的相应“loc”。 curP表示部分中的子值。

逻辑对我来说似乎是正确的,但我没有得到输出。我在哪里错了?

3 个答案:

答案 0 :(得分:1)

试试这个

getReference("parts").child(curP).addChildEventListener(new ChildEventListener() {

            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                Products data = dataSnapshot.getValue(Products.class);
                Log.i("", String.valueOf(data.getLoc()));

            }
        });

答案 1 :(得分:0)

您可以尝试使用ValueEventListener。如果您想要读取一次数据,请使用addListenerForSingleValueEvent方法,如下所示:

public async Task<Dictionary<string, string[]>> GetTemplates(string showName)
{
    Dictionary<string, string[]> d = new Dictionary<string, string[]>();

    // Get element collection uri of show "DemoShow"
    var elementCollectionUriTask = Task.Run(() => GetElementCollectionUri(vizServiceDocURL, showName));
    var elementCollectionUri = await elementCollectionUriTask;

    var templateCollectionUriTask = Task.Run(() => GetTemplateCollectionUri(elementCollectionUri));
    var templateCollectionUri = await templateCollectionUriTask;

    var templateNamesTask = Task.Run(() => GetListOfTemplateName(templateCollectionUri));
    var templateNames = await templateNamesTask;

    //get the name and links from each show and add them to the dictionary
    foreach (string templateName in templateNames)
    {
        var templateCollectionEntryUriTask = Task.Run(() => GetTemplateCollectionEntryUri(templateCollectionUri, templateName));
        var templateCollectionEntryUri = await templateCollectionEntryUriTask;

        var elementModelUriTask = Task.Run(() => GetTemplateElementModelUri(templateCollectionUri, templateName));
        var elementModelUri = await elementModelUriTask;

        await Task.Run(() => PrintVdfModel(elementModelUri));

        string[] links = new string[2] { templateCollectionEntryUri, elementModelUri };
        d.Add(templateName, links);
    }
    return d;
}

或者您可以使用addValueEventListener并获取任何更改的数据。我真的不认为ChildEventListener是从Firebase检索数据的好主意。

答案 2 :(得分:0)

问题是,您在onChildAdded()中获得的内容并不是您期望的完整Product对象。

在您的数据库参考中,您使用("parts/"+curP)定位特定产品ChildEventListener。特定产品节点的子节点为namelocsloc,因此onChildAdded()将触发多次,为您提供{{1}这些属性分开。

您可能用于获取整个Product对象的两种模式是:

  • 将ChildEventListener直接添加到&#34;部分&#34;节点,您将获得每个产品作为该节点的子节点,或者;
  • 如果要将侦听器直接添加到特定产品的节点,请使用ValueEventListener将整个节点条目作为一个dataSnapshot条目。