【发布时间】:2021-09-04 07:47:54
【问题描述】:
我正在通过 Android Studio 开发一个项目,我需要从 Firebase 实时数据库中获取数据。
public static void uploadData(String username, Measurement measurement) {
String date = measurement.getDayTime();
double pulse= measurement.getPulse();
double step= measurement.getStep();
double bodyTemp= measurement.getBodyTemp();
double humidity= measurement.getHumidity();
Query upload = reference.orderByChild("username").equalTo(username);
upload.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()){
reference.child(username).child(date).child("pulse").setValue(pulse);
reference.child(username).child(date).child("step").setValue(step);
reference.child(username).child(date).child("bodyTemp").setValue(bodyTemp);
reference.child(username).child(date).child("humidity").setValue(humidity);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
通过uploadData,我把它放到DB:
public static Measurement downloadData(String username){
//public static DatabaseReference reference = FirebaseDatabase.getInstance().getReference("healthData");
Query query = reference.orderByChild("username").equalTo(username);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()){
String dateStr = "04-09-2021 09:42";
tempMeasurement = snapshot.child(username).child(dateStr).getValue(Measurement.class);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
return tempMeasurement;
}
但是当我想取回数据时,它返回 null。
这就是我尝试编写并得到空错误的方式:
reportTV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Measurement temp = Measurement.downloadData(username);
Toast.makeText(getApplicationContext(), "Pulse: " + temp.getPulse(), Toast.LENGTH_SHORT ).show();
}
});
}
Firebase Json 格式
{
"healthData" : {
"mbaykols" : {
"04-09-2021 09:42" : {
"bodyTemp" : 36.5,
"humidity" : 60,
"pulse" : 70,
"step" : 1300
},
"04-09-2021 09:43" : {
"bodyTemp" : 36.5,
"humidity" : 60,
"pulse" : 70,
"step" : 1300
},
"04-09-2021 09:45" : {
"bodyTemp" : 36.5,
"humidity" : 60,
"pulse" : 70,
"step" : 1300
}
}
基本上,我需要获取数据。首先,我试图一一获得。在那之后,我会得到最后的 5 或 10。我需要的是如何接触到这个孩子。
更新 1
我在规则上所做的是
{
"rules": {
".read": "now < 1632776400000", // 2021-9-28
".write": "now < 1632776400000", // 2021-9-28
"healthData":{
"username":{
".indexOn": ["date","pulse","step","bodyTemp","humidity"]
}
}
}
}
更新 2
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference mbaykolsRef = rootRef.child("healthData").child(username);
Query queryByName = mbaykolsRef;
queryByName.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (task.isSuccessful()) {
for (DataSnapshot ds : task.getResult().getChildren()) {
String date = ds.child("date").getValue(String.class);
long pulse = ds.child("pulse").getValue(long.class);
long step = ds.child("step").getValue(long.class);
long bodyTemp = ds.child("bodyTemp").getValue(long.class);
long humidity = ds.child("humidity").getValue(long.class);
Log.d("TAG", date + "/" + pulse + "/" + step + "/" + bodyTemp + "/" + humidity);
}
} else {
Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
}
}
});
成功了。我想,它是关于 databaseReference 和查询定义的。如您所见,我更改了它们并收到类型错误。将String转换为long类型后,现在可以访问数据了
Logcat 输出:
2021-09-04 18:31:59.097 18739-18739/com.example.bitirme D/TAG: 04-09-2021 11:07:47/70/1300/36/60
2021-09-04 18:31:59.099 18739-18739/com.example.bitirme D/TAG: 04-09-2021 11:07:52/70/1300/36/60
2021-09-04 18:31:59.100 18739-18739/com.example.bitirme D/TAG: 04-09-2021 11:13:34/70/1300/36/60
2021-09-04 18:31:59.101 18739-18739/com.example.bitirme D/TAG: 04-09-2021 11:16:27/70/1300/36/60
2021-09-04 18:31:59.101 18739-18739/com.example.bitirme D/TAG: 04-09-2021 16:00:36/70/1300/36/60
2021-09-04 18:31:59.102 18739-18739/com.example.bitirme D/TAG: 04-09-2021 17:07:31/70/1300/36/60
2021-09-04 18:31:59.103 18739-18739/com.example.bitirme D/TAG: 04-09-2021 17:13:30/70/1300/36/60
2021-09-04 18:31:59.103 18739-18739/com.example.bitirme D/TAG: 04-09-2021 17:32:37/70/1300/36/60
2021-09-04 18:31:59.104 18739-18739/com.example.bitirme D/TAG: 04-09-2021 18:03:20/70/1300/36/60
2021-09-04 18:31:59.104 18739-18739/com.example.bitirme D/TAG: 04-09-2021 18:03:25/70/1300/36/60
2021-09-04 18:31:59.107 18739-18739/com.example.bitirme D/TAG: 04-09-2021 18:23:19/70/1300/36/60
2021-09-04 18:31:59.108 18739-18739/com.example.bitirme D/TAG: 04-09-2021 18:23:27/70/1300/36/60
2021-09-04 18:31:59.108 18739-18739/com.example.bitirme D/TAG: 04-09-2021 18:23:51/70/1300/36/60
【问题讨论】:
标签: java android firebase firebase-realtime-database google-cloud-platform