麻烦铸造一个长的双倍

时间:2017-04-21 01:46:09

标签: android firebase firebase-realtime-database

我一直在使用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/

1 个答案:

答案 0 :(得分:3)

这里的关键是要了解内置类型longdouble及其包装对象LongDouble之间的区别。 Java类型系统的规则允许您从long转换为double,反之亦然。但是,由于LongDouble是对象,因此只能根据用于所有引用的规则来转换引用。特别是,您只能从子级转换为父级(可以隐式发生)或从父级转换为继承层次结构中的子级。 LongDouble都延伸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开头。那么在这里检索值的问题就少了。