![](/img/trans.png)
[英]Android Studio Firebase Database DataSnapshot returning null
[英]Struggling with Google firebase Datasnapshot in Android studio
所以我在做一个项目,我必须从谷歌 Firebase 数据库中获取特定位置的值,并将它们放入 android 工作室的 textViews 中,我一直试图从 1 个位置获取 1 个值,以了解一切在我尝试 Z34D156BZBFA8 之前是如何工作的此外,这就是我一直在尝试做的事情:
数据库结构:
{
"Flower" : 100,
"Flowers" : {
"Flower1" : 123,
"Flower2" : 1233,
"Flower3" : 830,
"Flower4" : 95,
"Flower5" : 1,
"Flower6" : 20,
"Flower7" : 330,
"Flower8" : 50
}
}
因此,使用此代码,我将在我的 android 模拟器下方向您展示,但当我更改时:
String value = dataSnapshot.getValue().toString();
至:
String value = dataSnapshot.getValue(String.class);
它打开但不显示 textview 中的数据库中的任何值,我试图让它们到达,但当我尝试使用以下行显示它时,它也会返回 null: Log.d(TAG, "Value is: "value)
我可能只是对我自己的代码视而不见,因为我今天很长一段时间都试图让这项工作,但是我必须在我的代码中修复什么才能从数据库中获取价值到我的 textView 中?
感谢您提供可能的帮助。
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.Task;
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.google.firebase.database.ValueEventListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import okhttp3.OkHttpClient;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
FirebaseDatabase firebaseDatabase;
DatabaseReference databaseReference;
private static final String TAG = "MainActivity";
TextView textView1, textView2, textView3, textView4, textView5;
TextView textViewDate1, textViewDate2, textViewDate3, textViewDate4, textViewDate5, textViewDatabase;
ArrayList<String> listDate = new ArrayList<String>();
ArrayList<String> listTemp = new ArrayList<String>();
final String url = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
databaseReference = FirebaseDatabase.getInstance().getReference().child("Flower");
setTextViewIds();
connectToFmiAndShowResult();
getData();
}
private void getData() {
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
long value = dataSnapshot.getValue(Long.class);
textViewDatabase.setText("" + value);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
// Getting Post failed, log a message
Toast.makeText(MainActivity.this, "Fail to get data.", Toast.LENGTH_SHORT).show();
}
});
}
private void connectToFmiAndShowResult()
{
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(Call call, IOException e)
{
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful())
{
String myResponse = response.body().string();
String [] tokensTemp = myResponse.split("<BsWfs:ParameterValue>");
String [] tokensDate = myResponse.split("<BsWfs:Time>");
for (int i=1; i<tokensDate.length; i++)
{
listDate.add(tokensDate[i].substring(0, Math.min(tokensTemp[i].length(), 10)));
listTemp.add(tokensTemp[i].substring(0, Math.min(tokensTemp[i].length(), 5)).replace("<","").replace("/",""));
}
String d1 = listDate.get(0);
String d2 = listDate.get(1);
String d3 = listDate.get(2);
String d4 = listDate.get(3);
String dLast = listDate.get(listDate.size()-1);
String t1 = listTemp.get(0);
String t2 = listTemp.get(1);
String t3 = listTemp.get(2);
String t4 = listTemp.get(3);
String tLast = listTemp.get(listTemp.size()-1);
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run()
{
textViewDate1.setText(d1 + ":");
textViewDate2.setText(d2 + ":");
textViewDate3.setText(d3 + ":");
textViewDate4.setText(d4 + ":");
textViewDate5.setText(dLast + ":");
textView1.setText(t1 + "°C");
textView2.setText(t2 + "°C");
textView3.setText(t3 + "°C");
textView4.setText(t4 + "°C");
textView5.setText(tLast + "°C");
}
});
}
}
});
}
private void setTextViewIds()
{
textView1 = findViewById(R.id.textViewTemp1);
textView2 = findViewById(R.id.textViewTemp2);
textView3 = findViewById(R.id.textViewTemp3);
textView4 = findViewById(R.id.textViewTemp4);
textView5 = findViewById(R.id.textViewTemp5);
textViewDate1 = findViewById(R.id.textViewDate1);
textViewDate2 = findViewById(R.id.textViewDate2);
textViewDate3 = findViewById(R.id.textViewDate3);
textViewDate4 = findViewById(R.id.textViewDate4);
textViewDate5 = findViewById(R.id.textViewDate5);
textViewDatabase = findViewById(R.id.textViewDatabase);
}
}
要解决此问题,请更改以下代码行:
String value = dataSnapshot.getValue().toString();
至:
long value = dataSnapshot.getValue(Long.class);
而这一行:
textViewDatabase.setText(value);
至:
textViewDatabase.setText("" + value);
这是必需的,因为您的“Flower”属性在您的数据库中保存一个数字而不是字符串。 logcat 中的结果将是:
100
编辑:
看到您的新数据库模式,要打印100
,请使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference flowerRef = rootRef.child("Flower");
flowerRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (task.isSuccessful()) {
long value = task.getResult().getValue(Long.class);
Log.d(TAG, "value: " + value);
} else {
Log.d(TAG, task.getException().getMessage()); //Don't ignore potential errors!
}
}
});
logcat 中的结果将是:
value: 100
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.