我一直在使用google firebase在android上的实时数据库,以便实时绘制数据。当我从数据库中检索数据时,它将其设置为long。然后我试图将这些数据转换为双数,但它不起作用。
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.helper.StaticLabelsFormatter;
import com.jjoe64.graphview.series.DataPoint;
import com.jjoe64.graphview.series.LineGraphSeries;
public class MainActivity extends AppCompatActivity {
private DatabaseReference mDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Set up GraphView
GraphView graph = (GraphView) findViewById(R.id.graph);
final LineGraphSeries<DataPoint> series = new LineGraphSeries<>();
graph.addSeries(series);
//Initialize Database
mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("Electric").setValue("value set");
mDatabase.child("Water").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Double xl = (Double) dataSnapshot.child("time").getValue();
Double yl = (Double) dataSnapshot.child("Value").getValue();
double x = xl.doubleValue();
double y = yl.doubleValue();
new DataPoint(x ,y);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
出现此错误
FATAL EXCEPTION: main
Process: com.example.seniordesign.homemonitoringapp, PID: 3765
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
at com.example.seniordesign.homemonitoringapp.MainActivity$1.onChildAdded(MainActivity.java:35)
at com.google.android.gms.internal.zzbox.zza(Unknown Source)
at com.google.android.gms.internal.zzbqx.zzZT(Unknown Source)
at com.google.android.gms.internal.zzbra$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5731)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
at dalvik.system.NativeStart.main(Native Method)
我正在使用此图表库http://www.android-graphview.org/
答案 0 :(得分:3)
这里的关键是要了解内置类型long
和double
及其包装对象Long
和Double
之间的区别。 Java类型系统的规则允许您从long
转换为double
,反之亦然。但是,由于Long
和Double
是对象,因此只能根据用于所有引用的规则来转换引用。特别是,您只能从子级转换为父级(可以隐式发生)或从父级转换为继承层次结构中的子级。 Long
和Double
都延伸Number
,兄弟姐妹也是如此。
由于getValue()
返回的对象为Long
,因此您应该转为Long
而不是Double
:
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Long xl = (Long) dataSnapshot.child("time").getValue();
Long yl = (Long) dataSnapshot.child("Value").getValue();
double x = xl.doubleValue();
double y = yl.doubleValue();
new DataPoint(x ,y);
}
作为旁注,如果要存储“时间”和“值”数据,您可能需要考虑修改保存这些值的代码,以便将它们存储为Double
开头。那么在这里检索值的问题就少了。