上一篇博客记录了如何使用Firebase对实时数据库进行增删改以及持久化,本文记录如何对数据进行查操作,以及如何将文件上传服务器。
3.对实时数据库进行增删改查以及持久化操作(续)
Firebase数据库的检索操作主要是通过对树种的某一节点添加监听来实现(官方说的是对FirebaseDatabase添加监听,我认为不大准确,欢迎讨论),官方给出了几种可用的监听器,他们的功能如下:
对某一节点的事件进行监听,使用 addValueEventListener() 或者 addListenerForSingleValueEvent() 方法。 要对某一节点的子节点进行监听,可使用 addChildEventListener() 方法。
我们依然以博客文章为场景,看一个监听节点本身数据变化例子:
ValueEventListener postListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// 监听到数据库变化,传入一个该路径下的节点数据“快照”
Post post = dataSnapshot.getValue(Post.class);
// ...
}
@Override
public void onCancelled(DatabaseError databaseError) {
// 监听数据库失败
Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
// ...
}
};
mPostReference.addValueEventListener(postListener);
我们看到,监听器ValueEventListener的onDataChange回调中,传入了一个DataSnapShot的对象,这个对象可以理解为当前节点处的数据快照,即他记录了当前节点的现状,我们可以通过这个快照获取该节点处的各个值,这里通过getValue()方法传入Post类型,获取到我们的Post的Java对象。
DataSnapShot的概念在我看来有点类似于上文中提到的MutableData,他们都封装了某个节点的“现状”,在Firebase数据库中,节点并非只有我们这里要的Post对象,还有该节点的ID等,我们所要的Post对象仅仅是该节点众多封装数据中的一个而已。
再看一个监听子节点变化的例子,在博客中我们需要监听评论的变化:
ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());
// A new comment has been added, add it to the displayed list
Comment comment = dataSnapshot.getValue(Comment.class);
// ...
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
Log.d(TAG, "onChildChanged:" + dataSnapshot.getKey());
//一条评论被改动,我们可以获取这条评论的key来判断是否是一个正在被展示的评论,如果是则改动他
Comment newComment = dataSnapshot.getValue(Comment.class);
String commentKey = dataSnapshot.getKey();
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.d(TAG, "onChildRemoved:" + dataSnapshot.getKey());
// 一条评论被删除,我们通过获取这条评论的key来判断是否为一个正在被展示的评论,如果是,则删掉它
String commentKey = dataSnapshot.getKey();
// ...
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
Log.d(TAG, "onChildMoved:" + dataSnapshot.getKey());
// 一条评论改变