【问题标题】:FirebaseRecyclerAdapter but Failed to convert value of type java.util.HashMap to String?FirebaseRecyclerAdapter 但无法将 java.util.HashMap 类型的值转换为字符串?
【发布时间】:2017-10-04 00:14:49
【问题描述】:

尝试创建 FirebaseRecyclerAdapter 以从对象类中检索所有数据,但我收到错误“无法将 java.util.HashMap 类型的值转换为字符串” 这是我的代码:

public class Match {


    private Map<String, Object> name;
    private Map<String, Object> desc;

    public Map<String, Object> getName() {
        return name;
    }

    public Map<String, Object> getDesc() {
        return desc;
    }

    public Match(){} //even with /without this guy
}


public class MatchHolder extends RecyclerView.ViewHolder {
    private final TextView mNameField;
    private final TextView mMessageField;

    public MatchHolder(View itemView) {
        super(itemView);
        mNameField = (TextView) itemView.findViewById(android.R.id.text1);
        mMessageField = (TextView) itemView.findViewById(android.R.id.text2);
    }

    public void setName(Map<String, Object> name) {
        mNameField.setText((CharSequence) name);
    }

    public void setDesc(Map<String, Object> desc) {
        mMessageField.setText((CharSequence) desc);
    }
}



public class SportActivity extends AppCompatActivity {

    final FirebaseDatabase database = FirebaseDatabase.getInstance();



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sport);

 DatabaseReference ref = database.getReference("myApp/sportActivity"); //with this guy i get the mentioned error

        //if use         DatabaseReference ref = database.getReference("myApp/sportActivity/Match");
        //i get in the log cat ,error W/ClassMapper: No setter/field for name1,name2 ,desc1,desc2 ...etc    
         RecyclerView matches = (RecyclerView) findViewById(recycle_viewer);
        matches.setHasFixedSize(true);
       matches.setLayoutManager(new LinearLayoutManager(this));


        FirebaseRecyclerAdapter<Match, MatchHolder> mAdapter = new FirebaseRecyclerAdapter<Match, MatchHolder>(
                Match.class,
                android.R.layout.two_line_list_item,
                MatchHolder.class,
                ref) {
            @Override
            public void populateViewHolder(MatchHolder holder, Match match, int position) {
                holder.setName(match.getName());
                holder.setDesc(match.getDesc());
            }
        };

        matches.setAdapter(mAdapter);



    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        FirebaseRecyclerAdapter mAdapter = null;
        mAdapter.cleanup();
    }


    }

我无法上传我的数据库的图片,但是,结构是: 我的应用程序/运动活动/ 这是 sportActivity 的 Json:

"sportActivity" : {
      "Match" : {
        "desc" : {
          "des3" : "desc3",
          "desc2" : "desc2"
        },
        "name" : {
          "name1" : "name1",
          "name2" : "name2"
        }
      }
    }
  }
}

【问题讨论】:

  • 不要尝试上传图片,而是编辑您的问题以包含数据库的实际最小 JSON。您可以通过单击Firebase Database console 中的“导出 JSON”链接来获取此信息。
  • 你能显示更多代码吗?
  • @KeLiuyue 已提供所有必需的代码。
  • 我可以在你的代码中看到HashMap
  • @KeLiuyue 为了避免误导cmets,如果您对如何解决问题有建议,请评论我?

标签: java android firebase-realtime-database firebaseui


【解决方案1】:

Match 对象具有以下结构:

{
  "desc" : {
    "des3" : "desc3",
    "desc2" : "desc2"
  },
  "name" : {
    "name1" : "name1",
    "name2" : "name2"
  }
}

您用来读取此数据的 Java 类是:

public class Match {
   private String name; 
   private String desc;

   public Match() { }

   public String getName() { return name; }
   String getDesc() { return desc; }
}

这些不匹配:您的 Java 类说 desc 是一个字符串,但它实际上是一个嵌套的 JSON 对象。由于该嵌套 JSON 对象没有类,因此 Firebase 会将其读取为 Map&lt;String, Object。由于您的 desc 属性是字符串,因此它是不兼容的类型,会导致类转换异常。

要了解有关如何为嵌套对象建模的更多信息,请在此处查看我的答案:Creating Nested Object Firebase structure

更新:应用于您的 JSON,最小的 Java 类似乎是:

public class Match {
    private Map<String, Object> name;
    private Map<String, Object> desc;

    public Map<String, Object> getName() {
        return name;
    }

    public Map<String, Object> getDesc() {
        return desc;
    }
}

【讨论】:

  • 说在Match类中添加了这样的地图,其他类应该修改什么?
  • 我链接的答案包含一个完整的最小示例,说明您需要做什么。编辑您的问题以显示您做了什么,我会看看。
  • 我已将地图添加到我的匹配类中,现在我仍然得到相同的错误,除非我认为并且不知道该怎么做必须对其余的类/重新结构进行修改?
  • 添加了 getMatchMap(),但您的 JSON 中没有 matchMap 属性,因此它永远不会被填充。而您将 descname 属性定义为 String,这与您的 JSON 不匹配。
  • ,现在我得到了这个家伙 com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.myapp.packagename.Match
猜你喜欢
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
相关资源
最近更新 更多