我尝试查询Firebase数据库但仍然返回null。这是数据库的样子:
和Stem对象:
public class Stem {
private String stem;
public Stem(){}
public Stem(String stem){
this.stem = stem;
}
public String getText(){
return stem;
}
public void setText(String stem){
this.stem = stem;
}
}
OnCreate中的MainActivity
mFirebaseDatabase = FirebaseDatabase.getInstance();
mStemDatabaseReference = mFirebaseDatabase.getReference().child("Stems");
getStemButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mChildEventListener == null) {
mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Stem stem = dataSnapshot.getValue(Stem.class);
mStemAdapter.add(stem);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
mStemDatabaseReference.addChildEventListener(mChildEventListener);
}
}
});
查询似乎可以正常访问数据库,因为它返回Stems json数组,但是当它尝试将词干添加到适配器时,它将stem返回为null。有什么想法吗?
答案 0 :(得分:2)
这是由于Firebase使用异步调用来访问您的数据库。由于没有OnComplete侦听器,您应该通知适配器列表中的更改。当我遇到这个问题时,我正在使用RecyclerView,并在适配器上调用notifyDataSetChanged
以使用获取的值更新它。
答案 1 :(得分:1)
看起来数据库中Stems
下的值被识别为数组而不是对象。这是因为茎的关键是递增数。
您可以尝试从Firebase数据库控制台执行导出JSON ,并查看数据库的结构。您将获得的价值应该是这样的:
{
"Stems": [
null,
{ "stem": "Test for stem 1"},
{ "stem": "Test for stem 2"}
]
}
您可以使用数组here
了解有关Firebase行为的更多信息您的问题的解决方案是使用databaseReference.push()
方法生成新词干的密钥。使用push()
方法,您不必记住词干的最后一个键,将其递增1. Firebase还建议使用push()
方法作为添加新子项的方法
push()
方法用法示例:
// create new Stem object
Stem stem = new Stem("Test for new stem");
// push new key under 'Stems' and then set the Stem object as value under the new key
mStemDatabaseReference.push().setValue(stem);
希望这会有所帮助:)
编辑:如果您不想更改数据库结构
mStemDatabaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
GenericTypeIndicator<List<Stem>> genericTypeIndicator = new GenericTypeIndicator<List<Stem>>() {};
List<Stem> stemList = dataSnapshot.getValue(genericTypeIndicator);
for (Stem stem : stemList) {
if (stem != null) {
mStemAdapter.add(stem);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 2 :(得分:0)
尝试将Firebase查询移动到稍后在“活动”加载中的某个点。通过Intent传递值时我遇到了类似的问题,但是在执行intent之前,没有及时从Firebase返回数据以加载到变量中。也许您应该创建一个初始化函数并在On Create的底部调用它。
init(){
...your code...
}