Android Firebase,DataSnapshot转换为模型类

Android Firebase,DataSnapshot转换为模型类,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,在使用Firebase数据库时,向模型类强制转换DataSnapshot时出现问题 我以DataSnapshot的形式接收信息,当我将其设置为String()并记录时,我在数据库中看到了正确的信息(值)。但是当我尝试将其强制转换到我的模型类时,我看到了我的默认值(零值) 参考 @Override public void onDataChange(DataSnapshot dataSnapshot){ ResourcesFromActivity receivedData = dataSna

在使用Firebase数据库时,向模型类强制转换
DataSnapshot
时出现问题

我以DataSnapshot的形式接收信息,当我将其设置为String()并记录时,我在数据库中看到了正确的信息(值)。但是当我尝试将其强制转换到我的模型类时,我看到了我的默认值(零值)

  • 参考

    @Override
    public void onDataChange(DataSnapshot dataSnapshot){
        ResourcesFromActivity receivedData = dataSnapshot.getValue(ResourcesFromActivity.class);
        Log.e("Query Ref",dataSnapshot.getRef().toString());
        Log.e("Query DataS","\n "+dataSnapshot.toString() );
        Log.e("Query getVal()","\n "+ receivedData.toString() );
        Log.e("Query","\n "+ Long.toString(receivedData.getTotalMeters()));
        allLocations = receivedData.getMyLocationsList();
      (...)
    
    E/Query getRef():https://*********/users/pZl7xHxREefHZu3Zgd7ZZBSJTmA2/activities

  • DataSnapshot.toString()

    E/查询数据:DataSnapshot{key=activities,value={29May201720:11:16={,elapsedTime=0,currentTime=170529201116,(…), MyLocationList={(…)}//信息
    //当前时刻的最后数据

  • 铸造后的模型数据

  • E/Query getVal():ResourcesFromActivity{averageSpeed=0.0,maxSpeed=0.0,averageStrokeRate=0.0,totalMeters=0}//归零默认值

  • 在单个节点上,它正在工作

    {
      "rules": {
        "users": {
          "$uid": {
            ".read": "true",
            ".write": "$uid === auth.uid",
            "$userId" :{
            "activities":{
             "$activitieId": {
               ".read": "true",
               ".indexOn": ["currentTime"]
             }
            }
          }
          },
    
    }
    }
    
    usersactiviesref=database.getReference(“消息”); usersActivitiesRef.addValueEventListener(此)

  • 代码:At onCreate():

        (mAuth.getCurrentUser() == null) {
            mAuth.getCurrentUser().reload();
        }
        else{
            mUser = FirebaseAuth.getInstance().getCurrentUser();
            usersActivitiesRef = database.getReference("users").child(mUser.getUid()).child("activities");//.endAt(true).limitToLast(1);
    
           // usersActivitiesRef = database.getReference("message");
            Query query = usersActivitiesRef.orderByChild("currentTime").limitToLast(1);
            Log.e("Query getRef()",query.getRef().toString());
            //usersActivitiesRef.addValueEventListener(this);
            query.addValueEventListener(this);
        }
    
    @IgnoreExtraProperties
    public class ResourcesFromActivity {
    
    public String currentTime;
    public long elapsedTime;
    public String elapsedTimeStr;
    public float averageSpeed;
    public float maxSpeed;
    public float averageStrokeRate;
    public long totalMeters;
    public List<MyLocation> myLocationsList = new ArrayList<>();
    public List<Location> allLocations = new ArrayList<>();
    public List<Float> allStrokes = new ArrayList<>();
    
    public ResourcesFromActivity(){
        // Default constructor required for calls to DataSnapshot.getValue(ResourcesFromActivity.class)
    } 
    public ResourcesFromActivity(String currentTime, long elapsedTime, String elapsedTimeStr, float averageSpeed, float maxSpeed, float averageStrokeRate, long totalMeters, List<MyLocation> myLocationsList, List<Location> allLocations, List<Float> allStrokes) {
        this.currentTime = currentTime;
        this.elapsedTime = elapsedTime;
        this.elapsedTimeStr = elapsedTimeStr;
        this.averageSpeed = averageSpeed;
        this.maxSpeed = maxSpeed;
        this.averageStrokeRate = averageStrokeRate;
        this.totalMeters = totalMeters;
        this.myLocationsList = myLocationsList;
        this.allLocations = allLocations;
        this.allStrokes = allStrokes;
    }
    
    关于数据更改

    @Override
    public void onDataChange(DataSnapshot dataSnapshot){
        ResourcesFromActivity receivedData = dataSnapshot.getValue(ResourcesFromActivity.class);
        Log.e("Query Ref",dataSnapshot.getRef().toString());
        Log.e("Query DataS","\n "+dataSnapshot.toString() );
        Log.e("Query getVal()","\n "+ receivedData.toString() );
        Log.e("Query","\n "+ Long.toString(receivedData.getTotalMeters()));
        allLocations = receivedData.getMyLocationsList();
      (...)
    
    型号:

        (mAuth.getCurrentUser() == null) {
            mAuth.getCurrentUser().reload();
        }
        else{
            mUser = FirebaseAuth.getInstance().getCurrentUser();
            usersActivitiesRef = database.getReference("users").child(mUser.getUid()).child("activities");//.endAt(true).limitToLast(1);
    
           // usersActivitiesRef = database.getReference("message");
            Query query = usersActivitiesRef.orderByChild("currentTime").limitToLast(1);
            Log.e("Query getRef()",query.getRef().toString());
            //usersActivitiesRef.addValueEventListener(this);
            query.addValueEventListener(this);
        }
    
    @IgnoreExtraProperties
    public class ResourcesFromActivity {
    
    public String currentTime;
    public long elapsedTime;
    public String elapsedTimeStr;
    public float averageSpeed;
    public float maxSpeed;
    public float averageStrokeRate;
    public long totalMeters;
    public List<MyLocation> myLocationsList = new ArrayList<>();
    public List<Location> allLocations = new ArrayList<>();
    public List<Float> allStrokes = new ArrayList<>();
    
    public ResourcesFromActivity(){
        // Default constructor required for calls to DataSnapshot.getValue(ResourcesFromActivity.class)
    } 
    public ResourcesFromActivity(String currentTime, long elapsedTime, String elapsedTimeStr, float averageSpeed, float maxSpeed, float averageStrokeRate, long totalMeters, List<MyLocation> myLocationsList, List<Location> allLocations, List<Float> allStrokes) {
        this.currentTime = currentTime;
        this.elapsedTime = elapsedTime;
        this.elapsedTimeStr = elapsedTimeStr;
        this.averageSpeed = averageSpeed;
        this.maxSpeed = maxSpeed;
        this.averageStrokeRate = averageStrokeRate;
        this.totalMeters = totalMeters;
        this.myLocationsList = myLocationsList;
        this.allLocations = allLocations;
        this.allStrokes = allStrokes;
    }
    
    }


    谢谢

    这里的问题似乎是,作为dataSnapshot返回的内容与您期望得到的内容略有不匹配

    在本例中,您得到的不是单个活动记录,而是活动记录的映射,在本例中,它包含一个项(或一个子项),因为这是您在查询中指定的

    因此,这一点很重要,因为您不能直接将此映射设置为
    ResourcesFromActivity
    类,即使映射只包含一个项目,预期的字段也不匹配

    使用当前设置执行此操作的一种方法是修改
    onDataChange
    ,如下所示:

    @Override
    public void onDataChange(DataSnapshot dataSnapshot){
        for(DataSnapshot activitySnapShot: dataSnapshot.getChildren()){
            ResourcesFromActivity receivedData = activitySnapShot.getValue(ResourcesFromActivity.class);
        }
    }
    

    现在,我们正在迭代dataSnapshot的子项,以从子项中获取活动数据。在这种情况下,它只有一个子项,但您可以修改以处理多个子项。

    我可以看到您的变量是私有的。您是否为它们创建了getter和setter?是否有一个公共构造函数接受所有变量bles作为参数?我固定了私有变量,但没有任何更改,{我使用了alt+Insert,默认值为private,}创建一个将这些变量作为参数的构造函数。以及公共getter和setter。同样,不工作。是否可能有多个构造函数出现问题?