Firebase - 在 Android 中检索数据
Firebase - retrieve data in Android
我的数据如下所示:
{
"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
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;
}
}
当我 运行 代码时,文本视图都是空白的,没有错误消息。当我将 mRef
ValueEventListener 更改为:
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
,然后仅相应地显示课程代码和名称。问题可以找
在 mRef 的 MainActivity 中,它引用直到数据库的节点业务,它还有两个 children,我认为这些密钥是使用 push 生成的。所以,我认为你必须迭代它的 children。你能试试下面的方法吗:
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 之外的一些结果,那么可能必须在将 textView 映射到相应的键时起作用。
我的数据如下所示:
{
"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
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;
}
}
当我 运行 代码时,文本视图都是空白的,没有错误消息。当我将 mRef
ValueEventListener 更改为:
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
,然后仅相应地显示课程代码和名称。问题可以找
在 mRef 的 MainActivity 中,它引用直到数据库的节点业务,它还有两个 children,我认为这些密钥是使用 push 生成的。所以,我认为你必须迭代它的 children。你能试试下面的方法吗:
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 之外的一些结果,那么可能必须在将 textView 映射到相应的键时起作用。