【问题标题】:Firebase returns wrong values when addValueEventListener called调用 addValueEventListener 时 Firebase 返回错误值
【发布时间】:2017-10-05 09:15:15
【问题描述】:

我在 Firebase 上有一个数据库,并试图让 android 将其打印到 ListView 中。我可以让 ListView 打印一些东西,但它似乎是值的一些 ID,而不是实际值。关键是要能够做一个搜索栏,它可以找到数据库上的任何数据。 我在 addValueEventListener 中有一些注释代码。此代码应该可以工作,但是当我使用它时,当我转到“ExistingCustomerActivity”活动时,我的应用程序崩溃而没有错误。 My database structure and the output from the app, with the current code. 请注意,ListView 当前打印“买家”下方的值。 有没有人可以帮助解决这个问题?提前致谢。 更新:我可以看到数据在日志中正确加载,但它仍然显示我假设的某种 ID。

public class ExistingCustomerActivity extends AppCompatActivity {

        private DatabaseReference mDatabaseReference;
        private ListView mUserList;

        private ArrayList<Buyers> mUsernames = new ArrayList<>();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_existing_customer);

            mDatabaseReference = FirebaseDatabase.getInstance().getReference("Buyers");

            mUserList = (ListView) findViewById(R.id.UserListView);

            final ArrayAdapter<Buyers> arrayAdapter = new ArrayAdapter<Buyers>(this, android.R.layout.simple_list_item_1, mUsernames);

            mUserList.setAdapter(arrayAdapter);

            mDatabaseReference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    //Buyers buyerList = new Buyers(childSnapshot);

                        for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
                        Map<String, String> map = (Map<String, String>) childSnapshot.getValue();
                        Log.v("YourValue,","Map value is:" +map.toString());
                        Buyers buyerList = new Buyers(map);
                        mUsernames.add(buyerList);

                    }
                    arrayAdapter.notifyDataSetChanged();

                }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    }

买家类:

public class Buyers {
    private String car_Value;
    private String interest;
    private String driverLicenseNr;
    private String name;
    private String personNr;
    private String phone_Number;

public Buyers(Map<String,String> map){
    car_Value = map.get("Bil");
    interest = map.get("Interresse");
    driverLicenseNr = map.get("Kørekortnr");
    name = map.get("Navn");
    personNr = map.get("Personnr");
    phone_Number = map.get("Telefonnr");
}

【问题讨论】:

  • 您的 Firebase 数据库结构中没有 PersonNumberTextField
  • public Buyers() 构造函数中使用像 Bill,Intereresse and others 这样的实际变量名
  • “PersonNumberTextField”来自我将数据插入数据库的另一个活动。

标签: java android listview firebase-realtime-database


【解决方案1】:

您需要根据 firebase DB 结构更改您的 Buyers 类变量或使用 Map 获取值

尝试下面的代码使用 Map from Buyers 获取值

mDatabaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        //Buyers buyerList = new Buyers(childSnapshot);
        for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
            Map<String,String> map=(Map<String, String>) childSnapshot.getValue();
            Buyers buyerList = new Buyers(map);
            mUsernames.add(buyerList);
        }
        arrayAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

将您的构造函数从 DataSnapshot 更改为 Map 并获取值并设置到您的本地 Buyers 变量中。

public class Buyers {
    private String car_Value;
    private String interest;
    private String driverLicenseNr;
    private String name;
    private String personNr;
    private String phone_Number;


    public Buyers(Map<String,String map){
       car_Value = map.get("Bil");
       interest = map.get("Interresse")
       driverLicenseNr = map.get("Korekortnr")
       name = map.get("Navn")
       personNr = map.get("Personnr")     
       phone_Number =map.get("Telefonnr")
    }
}

【讨论】:

  • 嗯,这段代码没有报错,但还是返回了描述中链接中图片显示的值
  • 你的Buyers构造函数改了吗?
  • 是的,这部分似乎也有效,但值仍然是那些我认为是我想要的 ID 的字符串
  • 能不能log或者debug看看map的值是多少?
  • 恐怕不知道该怎么做,对这个很陌生
【解决方案2】:

你必须像下面那样做。

    mDatabaseReference.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        //Buyers buyerList = new Buyers(childSnapshot);

                        for (DataSnapshot childSnapshot: dataSnapshot.getChildren())
                        {
                            Buyers buyerList = childSnapshot.getValue(Buyers.class);
                            //buyerList = childSnapshot.child("PersonNumberTextField").getValue(Buyers.class);
                            //Buyers buyerList = childSnapshot.child("PersonNumberTextField").getValue(Buyers.class);
                            //Buyers buyerList = childSnapshot.getValue(Buyers.class);
                            mUsernames.add(buyerList);
                        }
                        arrayAdapter.notifyDataSetChanged();
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

【讨论】:

  • Buyers buyerList = childSnapshot.getValue(Buyers.class); 返回空记录,因为在 firebase 变量和买家变量不同
  • 那么你必须这样做。
  • @akhilesh0707 是对的,它使应用程序崩溃,这可能是因为它返回 null。你有办法解决这个 akhilesh0707 吗?
  • 是的,他可以使用地图或根据数据库更改字段
  • 我不确定你的意思。我有 mDatabaseReference = FirebaseDatabase.getInstance().getReference("Buyers");转到“买家”部分,我认为这足以找到我的数据库的价值
猜你喜欢
  • 2019-12-25
  • 1970-01-01
  • 2017-09-13
  • 2017-06-18
  • 1970-01-01
  • 2016-12-04
  • 2017-10-21
  • 2020-03-15
  • 1970-01-01
相关资源
最近更新 更多