新的Firebase SDK 3:通过DataSnapshot.getValue(Class <t> aClass)

时间:2016-05-27 16:18:43

标签: android firebase firebase-realtime-database

使用旧的Firebase SDK,DataSnapshot.getValue(Class aClass)方法能够从数据库中获取一个简单的字符串值,如:

"id": "name"

如果给定的类只有一个名为String value的属性,则返回一个POJO实例。这允许可以重复使用FirebaseAdapter的可重用实现,它可以同时处理复杂对象以及简单字符串。也许旧SDK中的行为是无意的,并且由于代码库中的一些更改而不再起作用。 除了创建一个全新的适配器之外,还有任何解决方法的建议吗?

编辑:完整示例 这个JSON片段代表我的整个数据库:

{
  "test" : {
    "id" : "value"
  }
}

然后我使用以下代码查询此条目,该代码仅包含onChildAdded中的相关代码,以便尽可能简单:

DatabaseReference ref = FirebaseDatabase.getInstance().getReferenceFromUrl("https://<MYPROJECT>.firebaseio.com");
Query query = ref.child("test");
query.addChildEventListener(new com.google.firebase.database.ChildEventListener() {
    @Override
    public void onChildAdded(com.google.firebase.database.DataSnapshot dataSnapshot, String s) {
        Record record = dataSnapshot.getValue(Record.class);
    }

    @Override
    public void onChildChanged(com.google.firebase.database.DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onChildRemoved(com.google.firebase.database.DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(com.google.firebase.database.DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

POJO Record看起来像这样:

public class Record {
    private String value;

    public Record() { }
    public Record(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

使用旧的JSON映射使用名为“value”的属性和带有一个字符串参数的构造函数。现在getValue(Record.class)崩溃了

  

无法将java.lang.String类型的对象转换为类型   com.journeytags.journeytagsandroid.model.Record。

当然,使用此构造获取单个字符串似乎是不必要的,但是,我在通用上下文中使用它,这有助于我避免针对此特殊情况的其他代码。

0 个答案:

没有答案