【问题标题】:Firebase - retrieve data in AndroidFirebase - 在 Android 中检索数据
【发布时间】:2016-08-07 12:59:28
【问题描述】:

我的数据是这样的:

{
 "courses" : {
    "Business" : {
      "-KOBuojCGl_KVNgCx6l3" : {
        "courseCode" : "BUS2202",
        "courseName" : "Business Mathematics"
      },
      "-KOCH9RvYkwIamb0oxi8" : {
        "courseCode" : "BUS2302",
        "courseName" : "Business Fundamentals"
      }
    },
    "Computing & IT" : {
      "-KOBukFDN8eDjzF77haS" : {
        "courseCode" : "SDT2201",
        "courseName" : "System Designs"
      },
      "-KOBuriS_C5njfhAkV_P" : {
        "courseCode" : "SDT3201",
        "courseName" : "Computer Project"
      },
      "-KOD-E81rtXhzEmSeRPx" : {
        "courseCode" : "SDT2202",
        "courseName" : "System Designs Year 2"
      },
    }
  }
}

UI 看起来像这样:

当用户选择 Business Fundamentals 时,textview1 应显示 BUS2302,textview2 应显示 Business Fundamentals。

我现在正在尝试的代码:

public class MainActivity extends AppCompatActivity{

    private TextView tv1, tv2;
    private DatabaseReference mRef;
    private String code, name;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRef = FirebaseDatabase.getInstance().getReference().child("courses").child("Business");
        tv1 = (EditText) findViewById(R.id.textview1);
        tv2 = (EditText) findViewById(R.id.textview2);

        mRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                CourseDetails courseDetails = dataSnapshot.getValue(CourseDetails.class);
                code = courseDetails.getCourseCode();
                name = courseDetails.getCourseName();
                tv1.setText(code);
                tv2.setText(name);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
}

CourseDetails类:

public class CourseDetails {
    private String courseCode;
    private String courseName;

    public CourseDetails() {
    }

    public CourseDetails(String courseCode, String courseName) {
        this.courseCode = courseCode;
        this.courseName = courseName;
    }

    public String getCourseCode() {
        return courseCode;
    }

    public void setCourseCode(String courseCode) {
        this.courseCode = courseCode;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
}

当我运行代码时,两个文本视图都是空白的,并且没有错误消息。当我将mRefValueEventListener 更改为:

mRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                tv1.setText(dataSnapshot.getValue().toString());
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

整个 JSON 数据在textview1 中打印出来,所以我知道我的数据在那里。但是当我使用getCourseCode() 和getCourseName() 时,文本视图是空白的。有什么建议吗?

我还有一个问题,代码将用于获取课程的push key,然后只显示相应的课程代码和名称。问题可以找here

【问题讨论】:

  • 尝试在 CourseDetails 类中将 courseCode 和 courseName 更改为 public 修饰符而不是 private。
  • 改成public后还是空白
  • 用户选择课程名称的按钮在哪里?
  • @Wilik :D 感谢您上次帮助我。这实际上是代码的一部分,但按钮只会保存用户选择。我测试了按钮,可以打印选择“业务”
  • 看起来问题已经解决了:D

标签: android firebase firebase-realtime-database event-listener


【解决方案1】:

在 mRef 的 MainActivity 中,它引用直到数据库的节点业务,它还有两个子节点,我认为这些子节点是使用 push 生成的。所以,我认为你必须迭代它的孩子。你能试试下面的方法吗:

 mRef.addValueEventListener(new ValueEventListener() {
 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
   // for each children
    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

        CourseDetails courseDetails = snapshot.getValue(CourseDetails.class);
        code = courseDetails.getCourseCode();
        name = courseDetails.getCourseName();
        tv1.setText(code);
        tv2.setText(name);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

}

如果这给出了除了 null 之外的一些结果,那么可能必须将 textViews 映射到相应的键。

【讨论】:

  • 谢谢。现在终于有数据显示了。你介意看看我的另一个问题here吗?
  • 我很高兴能帮上忙。我很困惑你的其他问题已经解决了吗?
  • 很好,没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多