如何从Firebase中读取对象?

时间:2017-08-03 09:45:22

标签: android firebase firebase-realtime-database

我真的很难掌握Firebase,而且无法让它发挥作用!

因此,我的Activity需要显示数据库中的Chart对象。图表在单独的类中定义。在OnCreate方法中,我执行以下操作:

    Intent intent = getIntent();
    chartKey = intent.getStringExtra("ChartKey");
    chart = new Chart(chartKey);
    chart.initialiseChart();
    chartName.setText(chart.getName());

所以,我读了上一个活动传递的图表键。我用它来创建一个新的Chart对象。然后我需要使用该键从数据库中读取Chart对象并设置对象的其余部分(这是我在initialiseChart中尝试做的),然后检索Chart名称并显示它。

但是,我无法让它正常工作 - initialiseChart只返回一个只包含键集的Chart(所以与传入时相同)。

以下是我的Chart类的相关部分:

    public class Chart {
        private String uid, key, name, details;

        public Chart() {}
        public Chart(String chartKey) {
            this.key = chartKey;
        }

       @Exclude
        public Map<String, Object> toMap() {
            HashMap<String, Object> result = new HashMap<>();
            result.put("uid", uid);
            result.put("key", key);
            result.put("name", name);
            result.put("details", details);
            return result;
        }

        public String getKey() { return this.key; }
        public String getUid() { return this.uid; }
        public String getName() { return this.name; }
        public String getDetails() { return this.details;}

public void initialiseChart() {

    if(this.key == null) return;

    DatabaseReference mChartReference = FirebaseDatabase.getInstance().getReference()
            .child("charts").child(this.key);

    mChartReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Chart chart = dataSnapshot.getValue(Chart.class);
            setUpChart(chart);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

private void setUpChart(Chart chart) {
    this.uid = chart.uid;
    this.name = chart.name;
    this.details = chart.details;
}

正如我所说,问题是,在从Activity调用'initialiseChart'之后,图表仍未设置。我猜这可能是它在从数据库中检索数据之前继续这条线路?所以我可能需要允许某种异步任务或......某事?

有人会告诉我这样做的正确方法,还是请给我一个例子?我只是围着它走了一圈,让自己感到困惑。我对Java也比较陌生,但没有帮助。我知道这可能是一件非常基本的事情,但我已经完成了文档和尽可能多的示例,并且看不到任何可以做到的事情。

1 个答案:

答案 0 :(得分:1)

这不起作用的原因是addListenerForSingleValueEvent是Asynchronies进程。当此代码运行时:

Intent intent = getIntent();
chartKey = intent.getStringExtra("ChartKey");
chart = new Chart(chartKey);
chart.initialiseChart();
chartName.setText(chart.getName()); // here the data isn't ready yet.

chartName.setText(chart.getName()); - &GT;对象图表没有准备好使用的数据。你可能会做的是添加监听器:

 Intent intent = getIntent();
chartKey = intent.getStringExtra("ChartKey");
chart = new Chart(chartKey);
chart.initialiseChart(new Runnable{
   public void run(){
       chartName.setText(chart.getName()); // this should run on ui thread         
   }
});