简介
如果您尚不清楚如何使用Firebase,您可以参考:《Firebase快速集成-Android篇》。本篇主要介绍Firebase中的两大事件的用法:值事件和子事件。它们都是用于监听Firebase线上数据库中数据的变化,只是具体表现不同。
值事件(ValueEventListener),可以用在只有单一数据的节点上,也可以用在含有子项数据的节点上,它的特色是只要任何一个子项数据有变化,它会把该节点上所有子项数据返回。
子事件(ChildEventListener),它在处理上述具有子项的情况时,不同于值事件,它会针对不同子项的数据变化做出针对该子项的动作。
在《Firebase快速集成-Android篇》一文中,我们的例子程序就用到了值事件,它使用值事件来监听某一个节点中值得变化。本章我们会创建一个具有子项的节点,然后分别用两种事件来监听,来让大家感受下不同。
创建含有子项的节点
先介绍一个好用的Firebase数据库管理插件-Vulcan。您可以在Chrome Web Store中下载,插件安装成功后。打开浏览器,右键点击Inspect(检查),您会看到多了一个Firebase选项卡,选择后,您会看到如下界面
选择您想操作的界面接可以操作了。然后在根节点上点击add后,选择Add JSON,此时就可以添加一个节点,并且可以用JSON方式来创建它的子项。
成功后,您会看到
值事件
mFireRef = new Firebase("https://fire-gochat.firebaseio.com/");
Firebase messages = mFireRef.child("messages");
messages.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Map<String, String> data = dataSnapshot.getValue(Map.class);
Log.d(TAG, data.get("a") + " " + data.get("b"));
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
因为该节点中的关键字和值都是String的,所以我们可以用一个Map<String, String>类型来获得该数据。
应用启动后,会打印Hello World
改变Hello为Welcome后,会打印Welcome World
删除a后,会打印null World
从上我们可以看到,改变某一个子项,整个Map都会被返回。
子事件
messages.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String data = dataSnapshot.getValue(String.class);
Log.d(TAG, "onChildAdded = " + data);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
String data = dataSnapshot.getValue(String.class);
Log.d(TAG, "onChildChanged = " + data);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
String data = dataSnapshot.getValue(String.class);
Log.d(TAG, "onChildRemoved = " + data);
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
//ignore here
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
从上可以看到,针对节点子项,分别有Added、Changed、Removed、Moved的四种操作监听,其中Moved与子项的位置变动有关,此处不做详细介绍。
Added:每添加一个子项会调用一次,并且dataSnapshot中只有被添加项目的值。
注:应用首次运行时,已存在的子项都会触发一次Added
Changed、Remved会在子项的值改变和子项被删除时被触发,返回被操作的子项的值。
详细使用方法可以参考API文档:
https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/ChildEventListener.html