Android Firebase,DataSnapshot转换为模型类
在使用Firebase数据库时,向模型类强制转换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
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//当前时刻的最后数据
{
"rules": {
"users": {
"$uid": {
".read": "true",
".write": "$uid === auth.uid",
"$userId" :{
"activities":{
"$activitieId": {
".read": "true",
".indexOn": ["currentTime"]
}
}
}
},
}
}
usersactiviesref=database.getReference(“消息”);
usersActivitiesRef.addValueEventListener(此) (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。同样,不工作。是否可能有多个构造函数出现问题?