【问题标题】:How to retrieve specific data from firebase realtime database when data changed数据更改时如何从firebase实时数据库中检索特定数据
【发布时间】:2020-02-14 01:36:38
【问题描述】:

我正在创建用户可以跟踪驾驶员位置的功能。我只想在司机位置发生变化时检索经纬度。

数据库结构

Firebase Realtime Database

driver.java(添加了setter和getter)

public class driver {
    private String Email, BusID, Carplate, PhoneNo, Password, Latitude, Longitude;

    public driver(String Email, String BusID, String Carplate, String PhoneNo, String Password,
                  String Latitude, String Longitude){
        this.Email = Email;
        this.BusID = BusID;
        this.Carplate = Carplate;
        this.PhoneNo = PhoneNo;
        this.Password = Password;
        this.Latitude = Latitude;
        this.Longitude = Longitude;
    }
    public String getEmail() {
        return Email;
    }
    public void setEmail(String email) {
        Email = email;
    }
    public String getBusID() {
        return BusID;
    }
    public void setBusID(String busID) {
        BusID = busID;
    }
    public String getCarplate() {
        return Carplate;
    }
    public void setCarplate(String carplate) {
        Carplate = carplate;
    }
    public String getPhoneNo() {
        return PhoneNo;
    }
    public void setPhoneNo(String phoneNo) {
        PhoneNo = phoneNo;
    }
    public String getPassword() {
        return Password;
    }
    public void setPassword(String password) {
        Password = password;
    }

    public String getLatitude() {
        return Latitude;
    }

    public void setLatitude(String latitude) {
        Latitude = latitude;
    }
    public String getLongitude() {
        return Longitude;
    }
    public void setLongitude(String longitude) {
        Longitude = longitude;
    }

Java

databaseReference = FirebaseDatabase.getInstance().getReference("Driver");

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                driver loc = dataSnapshot.getValue(driver.class);
                if (loc != null) {
                    Log.d("Location", "" +loc.getLatitude()+ ", " +loc.getLongitude());
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

如何从数据库中获取数据? 请帮我。谢谢

【问题讨论】:

  • 您似乎没有尝试使用文档中描述的 DataSnapshot:firebase.google.com/docs/database/android/read-and-write
  • 感谢您的回复@DougStevenson。我试过它可以工作,但我的数据是空的,我发现了这个W/ClassMapper: No setter/field for YwYeegL8MjPU5J6RtK7JXNazc9Y2 found on class com.example.publictransporttracker.driver。我该如何解决这个问题?

标签: android firebase firebase-realtime-database


【解决方案1】:

把你的班级改成这样:

public class Driver {
    private String email, busID, carplate, phoneNo, password, latitude, longitude;

    /** No-arg constructor (takes no arguments). */
    public Driver() {
    }

    public Driver(String email, String busID, String carplate, String phoneNo, String password,
                  String latitude, String longitude){
        this.email = email;
        this.busID = busID;
        this.carplate = carplate;
        this.phoneNo = phoneNo;
        this.password = password;
        this.latitude = latitude;
        this.longitude = longitude;
    }

你需要遵循java bean convention,然后在添加数据时,创建一个新的Driver对象并在setValue()内部使用它:

Driver dirver = new Driver(email, busID, carplate, phoneNo, password,latitude,longitude);
mDatabase.child(userId).setValue(user);

然后要检索数据,请执行以下操作:

databaseReference = FirebaseDatabase.getInstance().getReference("Driver");

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                  Driver driver = dataSnapshot.getValue(Driver.class);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

https://firebase.google.com/docs/database/android/read-and-write

【讨论】:

  • 感谢@Peter Haddad,您的解决方案有效,但在使用 getter 时,我无法在数据库中获取经度和纬度值。我找到了日志W/ClassMapper: No setter/field for YwYeegL8MjPU5J6RtK7JXNazc9Y2 found on class com.example.publictransporttracker.driver。我该如何解决?
  • 将setter和getter添加到你的类,忘了在android studio中添加你可以编写click并自动生成getter和setter
  • 像我的回答一样更改变量的名称很重要,否则它无法将对象映射到数据库,因此将它们更改为 camelCase 然后生成 getter 和 setter
  • 感谢您的回答@Peter Haddad,我已经解决了我的问题。
猜你喜欢
  • 2021-08-22
  • 2019-02-04
  • 2020-07-15
  • 2018-09-11
  • 1970-01-01
  • 2019-04-16
  • 2020-12-09
  • 1970-01-01
相关资源
最近更新 更多