Android / Firebase - 无法将java.util.ArrayList类型的对象转换为** my object **

时间:2016-10-07 21:12:00

标签: android firebase firebase-realtime-database

我试图在"模板下获取每个节点的值。"

enter image description here

例如," eght" (只是随机测试名称),包含ArrayLists的ArrayList。所以,ArrayList< .ArrayList>。

我只需要获取一次值,因此我使用单个事件监听器:

mTemplateRef.addListenerForSingleValueEvent(
     new ValueEventListener() {
     @Override
     public void onDataChange(DataSnapshot dataSnapshot) {

          for(DataSnapshot templateSnapshot : dataSnapshot.getChildren()){

               // I've tried a million different things here, but all result in the error
              // This is the error line
              MapFoo mapFoo = templateSnapshot.getValue(MapFoo.class);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.w(TAG, "getUser:onCancelled", databaseError.toException());
                    // ...
                }
            });

我总是最终得到这个:

Can't convert object of type java.util.ArrayList to type com.appname.template_editor.MapFoo

最后一部分是我尝试的任何对象。

这里是MapFoo:

顺便说一下,我使用Map,因为在调试时,节点似乎是HashMap形式。我还尝试了一个具有相同错误的HashMap对象。我还尝试了其他一些对象试图让它工作但没有成功。

public class MapFoo {
public Map<String, ArrayList> mapList;

public MapFoo(){

}

public Map getMapList(){
    return mapList;
}

public MapFoo(Map<String, ArrayList> mapList){
    this.mapList = mapList;
}

}

我尝试的另一种变体:

public class MasterListTemplateClass {

public String templateName;
public ArrayList<ArrayList> arrayList;

public MasterListTemplateClass() {
}

public MasterListTemplateClass(String templateName, ArrayList<ArrayList> arrayList) {
    this.templateName = templateName;
    this.arrayList = arrayList;
}

public String getName() {
    return templateName;
}

public ArrayList<ArrayList> getList() {
    return arrayList;
}

}

我无法解决任何问题。我只需要数据库中的值!

2 个答案:

答案 0 :(得分:2)

而不是像0,1,2这样的数字ID给它们一个名称,以便能够塑造你的模型  因为我不确定是否可以制作带有数字名称的模型。

e.g。将0,1,2分别命名为days,title,dimen并创建以下模型

public class MyModel{

    public String days;
    public String title;
    public String dimen;

    public MyModel(){

    }

    public String getDays(){
        return this.days;
    }

    public String getTitle(){
        return this.title;
    }

    public String getDimen(){
        return this.dimen;
    }
}

然后通过调用2 snapshot.getChildren()

通过2个循环到达此模型
 for(DataSnapshot templateSnapshot : dataSnapshot.getChildren()){
     for(DataSnapshot snap : templateSnapshot.getChildren()){


              MyModel model = snap.getValue(MyModel.class);
                    }
                }
...

答案 1 :(得分:1)

记得这篇文章。找到了答案。当你在Firebase中使用地图时,如果你有一个int作为字符串(1对比“1”),Firebase会将其作为int读取。是否将其作为字符串输入。所以我所做的就是在数字(“1_key”)中添加“_key”,这迫使Firebase将其作为字符串读取而不是int。这固定了事情