繁体   English   中英

在 Android 工作室中使用 Google firebase 数据快照苦苦挣扎

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM