Firebase getKey返回值类型转换异常:String无法转为long求助
解决Firebase数据库String转Long崩溃的问题
嘿,这个错误我太熟了!本质上就是Firebase在尝试把数据库里的字符串类型值转换成你代码里声明的Long类型变量时失败了,完全是类型不匹配搞的鬼。咱们先把报错核心拎出来看:
FATAL EXCEPTION: main
Process: com.example.ahmad.carrental, PID: 15975
com.google.firebase.database.DatabaseException: Failed to convert a value of type java.lang.String to long
这个报错直接明说:数据库里存的是String,你代码里却硬要用Long去接,这不就撞车了嘛!下面分两种常见情况给你解决办法:
情况1:数据库里的值本来应该是数字,却不小心存成了字符串
先打开Firebase控制台,找到对应的数据库节点,看看那个值是不是带引号的字符串(比如显示的是"123"而不是纯数字123)。如果是存错了:
- 要么直接在控制台把字符串改成数字;
- 要么修改你写入数据库的代码,确保写入的是Long类型而不是String:
// 错误写法:把数字当成字符串存了 databaseReference.child("price").setValue("200"); // 正确写法:直接存Long类型数值 databaseReference.child("price").setValue(200L);
情况2:数据库里的值确实是字符串,但你代码里误用了Long接收
这种情况就得调整代码了,要么改接收的字段类型,要么手动转换:
- 方法一:如果用了POJO实体类,直接把对应字段改成String:
// 错误写法:用Long接收字符串值 private Long carPrice; // 正确写法:用String匹配数据库类型 private String carPrice; - 方法二:如果需要把字符串转成Long使用,读取时手动处理(记得加异常捕获,防止值不是合法数字):
databaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // 先按String读取数据库里的值 String priceStr = dataSnapshot.child("carPrice").getValue(String.class); try { // 转换成Long类型 Long priceLong = Long.parseLong(priceStr); // 在这里用转换后的数值更新视图就好 textViewPrice.setText(String.valueOf(priceLong)); } catch (NumberFormatException e) { // 万一字符串不是合法数字,这里做容错处理 e.printStackTrace(); textViewPrice.setText("无效价格"); } } @Override public void onCancelled(DatabaseError databaseError) { // 处理数据库读取取消的情况 } });
额外小提醒
- 写入数据库时尽量保持类型一致:数字就用Long/Integer,文本就用String,别混着来;
- 读取数据时优先用
getValue(Class<T>)指定明确类型,别依赖Firebase的自动转换; - 用POJO映射的话,一定要保证实体类字段类型和数据库里的类型完全对应,不然很容易踩这种类型转换的坑。
内容的提问来源于stack exchange,提问作者Akay
相关产品推荐
相关产品推荐

