2016-12-03 186 views
0

我试图查询Firebase数据库,但保持null返回。这里是数据库的样子:Android Firebase数据库查询返回null

enter image description here

与阀杆对象:

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

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

      } 
     }); 

查询在MainActivity似乎访问数据库罚款因为它返回了Stems json数组,但是当它试图将stem添加到适配器时,它将返回为空的stem。有任何想法吗?

+0

在点击这里没用任何 – uguboz

+0

方式仍然没有返回干对象 – robbiestells

+0

也许stemadapter不通知的变化。使用system.out.print打印干对象以确保它不为null – uguboz

回答

1

看起来像数据库中的Stems下的值被识别为数组而不是对象。这是因为茎的关键是一个递增的数字。

您可以尝试执行从Firebase数据库控制台导出JSON并查看数据库结构。你会得到的值应该是这样的:

{ 
    "Stems": [ 
     null, 
     { "stem": "Test for stem 1"}, 
     { "stem": "Test for stem 2"} 
    ] 
} 

你可以阅读更多关于火力地堡行为与阵列here

你的问题的解决方案是使用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) { 

    } 
}); 
+0

感谢您的回应!请原谅我,因为我是Firebase的新手,但不会将数据写入数据库?我只是想读它。 – robbiestells

+0

@robbiestells我已经更新了我的回答 – Wilik

+0

谢谢,但我仍然无法让它工作@Wilik。有没有更好的方法来构建数据库以便于阅读? – robbiestells

2

这是由于Firebase使用异步调用访问您的da tabase。由于没有OnComplete监听器,因此应该通知适配器列表中的更改。当我遇到这种情况时,我正在使用RecyclerView,并在适配器上调用notifyDataSetChanged以使用提取的值更新它。

0

尝试将Firebase查询移到稍后在活动负载中的某个点。当通过Intent传递值时,我遇到了类似的问题,但是数据并未从Firebase中及时返回,以便在执行意图之前加载到变量中。也许你应该创建一个初始化函数并在On Create的底部调用它。

init(){ 
...your code... 
}