Firebase - 在Android中检索数据 [英] Firebase - retrieve data in Android

查看:163
本文介绍了Firebase - 在Android中检索数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



  {
courses:{
商业:{
-KOBuojCGl_KVNgCx6l3:{
courseCode:BUS2202,
courseName:商业数学
},
- 「计算及资讯科技」:{
courseCode:BUS2302,
courseName:商业基础
}
},
: {
-KOBukFDN8eDjzF77haS:{
courseCode:SDT2201,
courseName:系统设计
},
-KOBuriS_C5njfhAkV_P: {
courseCode:SDT3201,
courseName:计算机项目
},
-KOD-E81rtXhzEmSeRPx:{
courseCode :SDT2202,
courseName:系统设计年2
},
}
}
}



一个用户界面如下所示:



当用户选择业务基础时, textview1 应该显示BUS2302和 textview2 基本面。



我现在正在尝试的代码:

  public class MainActivity扩展AppCompatActivity {

私有TextView tv1,tv2;
private DatabaseReference mRef;
私有字符串代码,名称;

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
$ b $ 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){

$ b});


code $
$ b $ p $ CourseDetails


  public class CourseDetails {
private String courseCode;
private String courseName;
$ b $ 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;


$ / code $ / pre

当我运行代码时,textviews只是空白,并没有错误信息。当我将 mRef > ValueEventListener更改为:

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

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

整个JSON数据打印在 textview1 ,所以我知道我的数据在那里。但是当我使用 getCourseCode() getCourseName()时,textviews是空白的。任何建议?

我有另外一个问题,代码将用于得到按键课程,那么只显示课程代码和名称。这个问题可以在在这里

解决方案

在你的MainActivity for mRef中引用直到节点Business的数据库有两个子键我认为这是使用 push 生成的。所以,我认为你必须迭代它的孩子。你可以尝试像下面这样:

$ p $ mRef.addValueEventListener(new ValueEventListener(){
@Override
(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的时候分别使用key。

I have a data looks like this:

{
 "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"
      },
    }
  }
}

And an UI looks like this:

When user selects Business Fundamentals, textview1 should display BUS2302 and textview2 should display Business Fundamentals.

Codes I'm trying now:

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 class:

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;
    }
}

When I run the codes, both the textviews just blank, and no error message. When I changed mRef ValueEventListener to this:

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

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

The whole JSON data printed out in textview1, so I know my data is there. But when I use getCourseCode() and getCourseName(), the textviews are blank. Any suggestions?

I have another question which the codes will be used to get the push key of a course, then only display the course code and name accordingly. The question can be found here

解决方案

In your MainActivity for mRef it reference till node Business of the database which has further two children with keys which I think are generated using push. So, I think you have to iterate over it's children. Can you try something like below:

 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) {

    }
});

}

If this gives some result apart from null, then may have to work in mapping textViews with respective to key.

这篇关于Firebase - 在Android中检索数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆