从 firebase 检索数据

我假设你已经知道在 android studio 中添加 gradle 依赖项 firebase。如果你不是从这里按照指南。在 firebase 控制台中添加你的应用程序,添加依赖项后重新同步 android studio。仅 firebase 数据库和 firebase 身份验证不需要所有依赖项。

现在我们知道如何存储数据以及如何添加 gradle 依赖项,让我们看看如何使用导入的 firebase android SDK 来检索数据。

创建一个 firebase 数据库引用

DatabaseReference userDBRef = FirebaseDatabase.getInstance().getReference();
// above statement point to base tree
userDBRef = DatabaseReference.getInstance().getReference().child("user_base")
// points to user_base table JSON (see previous section)

从这里你可以链接多个 child() 方法调用以指向你感兴趣的数据。例如,如果数据存储如上一节所述,并且你想指向 Bruce Wayne 用户,你可以使用:

DatabaseReference bruceWayneRef = userDBRef.child("371298");
// 371298 is key of bruce wayne user in JSON structure (previous section)

或者只是将整个引用传递给 JSON 对象:

DatabaseReference bruceWayneRef = DatabaseReference.getInstance().getReference()
     .child("user_base/371298");
// deeply nested data can also be referenced this way, just put the fully
// qualified path in pattern shown in above code "blah/blah1/blah1-2/blah1-2-3..."

现在我们已经获取了要获取的数据的引用,我们可以使用侦听器来获取 Android 应用程序中的数据。与使用改造或排序激活 REST API 调用的传统调用不同,此处需要一个简单的回调侦听器来获取数据。Firebase sdk 调用回调方法,你就完成了。

基本上有两种类型,你可以连接监听器的,一个是 ValueEventListener ,另一种是 ChildEventListener (在下一节介绍)。对于节点下的数据的任何更改,我们有引用并添加了侦听器,value 事件侦听器返回整个 JSON 结构,子事件侦听器返回发生更改的特定子节点。这两者都以他们自己的方式有用。要从 firebase 获取数据,我们可以将一个或多个侦听器添加到 firebase 数据库引用(我们之前创建的 listDBRef 列表)。

这是一些示例代码(代码后的代码说明):

userDBRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        User bruceWayne = dataSnapshot.child("371298").getValue(User.class);
        // Do something with the retrieved data or Bruce Wayne
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e("UserListActivity", "Error occured");
        // Do something about the error
    });

你是否注意到 Class 类型已通过。 DataSnapshot 可以将 JSON 数据转换为我们定义的 POJO,简单传递正确的类类型。

如果你的用例不需要整个数据(在我们的情况下是 user_base 表),每次发生一些小的更改或者说你只想获取数据一次,你可以使用数据库引用的 addListenerForSingleValueEvent() 方法。这只会触发一次回调。

userDBRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // Do something
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // Do something about the error
    });

上面的示例将为你提供 JSON 节点的值。要获得密钥,只需致电:

String myKey = dataSnapshot.getKey();