【问题标题】:Firebase always true when checking if data exists检查数据是否存在时,Firebase 始终为真
【发布时间】:2018-06-19 18:59:35
【问题描述】:

我想检查当前 2 个引用中的数据是否存在,但它似乎总是返回 true(总是第一个 Toast),我认为没有检查 URL_CARS 和 URL_PLANES 是否存在,这就是我所拥有的:

mDatabase.child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("URL_CARS").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(final DataSnapshot dataSnapshotCars) {
                mDatabase.child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("URL_PLANES").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshotPlanes) {

                        if (dataSnapshotCars!=null && dataSnapshotPlanes!=null) {
                            Toast.makeText(LoginActivity.this, "DATA EXISTS", Toast.LENGTH_SHORT).show();

                        }else{
                            Toast.makeText(LoginActivity.this, "Data DOSNT EXISTS", Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {}
                });

数据库结构

Users +_
        -L4K1JDJS4K2599SK3+_
                            URL_CARS: 
                            URL_PLANES:

【问题讨论】:

  • 请添加您的数据库结构。
  • 为什么不创建 2 个不同的函数来使用不同的调用来检查它们是否存在?
  • 给你@AlexMamo

标签: android database firebase firebase-realtime-database


【解决方案1】:

当您尝试读取数据时,Firebase 将始终为您返回一个快照,并且它永远不会为空。因为Datasnapshot 对象包含两个属性:keyvalue,所以它类似于Datasnapshot(key, value)。当您根据某个键查询数据库时,该值可能不存在(您的情况),但您已将该键传递给该 Datasnapshot 对象(这意味着该键存在)。因此,您获得的数据快照类似于:Datasnapshot(key="URL_PLANES", value=null)。这意味着datasnapshot!=null 将永远为真。

您可以做的是使用exists() 方法检查值是否存在:

@Override
                    public void onDataChange(DataSnapshot dataSnapshotPlanes) {

                        if (dataSnapshotCars.exists() && dataSnapshotPlanes.exists()) {
                            Toast.makeText(LoginActivity.this, "DATA EXISTS", Toast.LENGTH_SHORT).show();

                        }else{
                            Toast.makeText(LoginActivity.this, "Data DOSNT EXISTS", Toast.LENGTH_SHORT).show();
                        }
                    }

或者获取快照值,然后检查是否不为空:

@Override
                    public void onDataChange(DataSnapshot dataSnapshotPlanes) {

                        if (dataSnapshotCars.getValue()!=null && dataSnapshotPlanes.getValue()!=null) {
                            Toast.makeText(LoginActivity.this, "DATA EXISTS", Toast.LENGTH_SHORT).show();

                        }else{
                            Toast.makeText(LoginActivity.this, "Data DOSNT EXISTS", Toast.LENGTH_SHORT).show();
                        }
                    }

【讨论】:

  • 嗨,我刚做完这个问题就做了这个,但它也不起作用
  • 谢谢,似乎 dataSnapshotCars.getValue()!=null 解决了问题
【解决方案2】:

要解决这个问题,请使用以下代码:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Users").child(uid);
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot.child("URL_CARS").exists()) {
            Toast.makeText(LoginActivity.this, "DATA EXISTS", Toast.LENGTH_SHORT).show();
        }
        if(dataSnapshot.child("URL_PLANES").exists()) {
            Toast.makeText(LoginActivity.this, "DATA EXISTS", Toast.LENGTH_SHORT).show();
        }   
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(eventListener);

您可能看到我使用了exists() 方法,如果快照包含非空值,则返回true。

还有另一种听起来像这样的方法:

if(dataSnapshot.hasChild("URL_CARS")()) {}
if(dataSnapshot.hasChild("URL_PLANES")()) {}

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 2017-12-04
    • 2021-11-14
    相关资源
    最近更新 更多