【问题标题】:How can I check if a value exists already in a Firebase data class Android如何检查 Firebase 数据类 Android 中是否已存在值
【发布时间】:2016-08-15 03:25:42
【问题描述】:

我想检查 Firebase 的数据库中是否已经存在公交车号。

这是我的示例代码。过去几天我一直在寻找,但找不到合适的代码。

ref = new Firebase(Config.FIREBASE_URL);
postRef = ref.child("BusNumber");

busNum = edtBus.getText().toString().trim();
route1 = route.trim();
seat = edtSeat.getText().toString().trim();

if (!busNum.isEmpty() && !route1.isEmpty() && !seat.isEmpty()) {
    postRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.child(busNum).exists()) {
                edtBus.setError("Bus number already exists.");
                edtBus.setText("");
            } else {
                busNumber = new BusNumber();
                busNumber.setBusNum(busNum);
                busNumber.setRoute(route1);
                busNumber.setNumSeat(seat);
                postRef.push().setValue(busNumber);
                edtBus.setText("");
                edtSeat.setText("");
                Toast.makeText(AddBusActivity.this, "Saving successful!", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Toast.makeText(AddBusActivity.this, "Error", Toast.LENGTH_SHORT).show();
            Toast.makeText(AddBusActivity.this, firebaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

} else {
    Toast.makeText(AddBusActivity.this, "Please complete the information", Toast.LENGTH_SHORT).show();
}

有人可以帮我解决这个问题吗?提前致谢。 无论 if 语句是否正确,我的问题也是为什么 postRef.addListenerForSingleValueEvent... 不起作用?我尝试测试一些 toast 消息,但消息不会弹出。

【问题讨论】:

  • 您是否有任何 Firebase 规则设置阻止您读取数据库?也许在 onCanceled 中添加一个 Log 并打印出 firebase 错误(如果有)。
  • @linxy 是的,我已经做到了。但据我记忆。没有错误
  • 找到解决办法了吗?
  • 这是因为你没有使用回调函数和接口我也有和你一样的问题 for (datasnap shot /....) full 方法不起作用它只是给出是否为空值或空对象引用,或者您没有得到所需的值,请参阅我的问题的链接.. 一个好人通过给我链接来指导我.. 第一个链接帮助我使用回调和接口技巧。 [乳清你的代码 firebase 数据库没有工作点击这个超链接](stackoverflow.com/questions/51582992/…)

标签: android firebase firebase-realtime-database


【解决方案1】:

你的方法是错误的。

当您这样做dataSnapshot.child(busNum).exists() 时,它会在密钥部分中寻找busNum,您的密钥是-kasajdh...

因此,您现在可以做的是获取iterable,当您寻找 data.child(busNum).exists()与价值有关

   postRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot data: dataSnapshot.getChildren()){
                    if (data.child(busNum).exists()) {
                        //do ur stuff
                    } else {
                       //do something if not exists
                    }
                  }
                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {

                }
            });

【讨论】:

    【解决方案2】:

    您可以查询确切的条目,而不是获取整个可迭代的数据列表。

      postRef = FirebaseDatabase.getInstance().getReference().child("BusNumber");
    
        postRef.orderByChild("busNum").equalTo(busNum)
            .addListenerForSingleValueEvent(new ValueEventListener() {
    
               @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.exists()){
                       //bus number exists in Database
                } else {
                    //bus number doesn't exists.
                }
    
                @Override
                public void onCancelled(FirebaseError firebaseError) {
    
                }
            });
    

    【讨论】:

      【解决方案3】:
      dataSnapshot.child(busNum).getValue() != null
      

      应该可以。

      【讨论】:

      • 但它不起作用。即使我尝试在 onDataChange 方法中发送一些消息,也永远不会弹出消息。
      • 检查您的 Firebase 身份验证规则可能吗?规则可能会阻止您这样做。
      • 但我没有创建新用户。它存储在数据库中。我还需要检查我的身份验证规则吗?
      • 对不起,我指的是你的数据库规则,而不是身份验证
      • 另一个问题可能是您使用的是旧 Firebase,因此它可能已被弃用?
      【解决方案4】:

      很难猜出问题所在,因为您没有说明busNumbusNumber 是如何定义和管理的。 busNumber 是字符串吗?

      push() 创建对自动生成的子位置的引用。自动生成的密钥类似于-KPB_cS74yoDaKkM9CNB

      语句postRef.push().setValue(busNumber) 将值busNumber 存储在位置BusNumber/<push-generated-key>

      语句dataSnapshot.child(busNum).exists() 测试位置BusNumber/<busNum> 是否存在值。除非busNumpush() 创建的密钥之一,否则它不会是真的。

      不清楚您希望数据的结构如何。如果您的巴士号码是字符串并且是唯一的,则无需使用push() 生成密钥。您可以使用以下方式存储总线号码的存在:

      postRef.child(busNumber).setValue(true)

      【讨论】:

      • 我不明白为什么我需要 setValue(true).. 我想做的就是检查数据库中是否已经存在公交车号。因为如果公交车号存在,它会提示,但如果不存在,它将在数据库中创建一组新的公交车
      • @tin: busNumber 是字符串吗?
      【解决方案5】:
      if(!(dataSnapshot.child("Users").child(busNum).exists()))
      

      然后是 hashmap 对象

      【讨论】:

      • 虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的以及何时使用它。从长远来看,纯代码的答案没有用处。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 2011-12-10
      • 2020-12-30
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      相关资源
      最近更新 更多