如何检查数据库中是否已存在数据?

时间:2019-04-16 12:51:16

标签: android firebase-realtime-database

我正在开发一个预订移动应用程序,当我单击checkAvailability时,它将检查数据库中是否已存在数据。我的问题是,由于密钥是随机生成的,所以我不知道如何访问。我有很多类似的问题要解决,但没有解决方案对我有用。

Firebase数据库(屏幕截图):

Database

btnAvailability.setOnClickListener

btnAvailability.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Query userQuery = database.getInstance().getReference().child("Requests")
                    .orderByChild("order/0");
            userQuery.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    String type = dataSnapshot.child("checkIn").getValue().toString();
                    String type2 = dataSnapshot.child("productName").getValue().toString();
                    if(type.equals(checkInTV.getText().toString()) && type2.equals(beach_name.getText().toString())) {
                        Toast.makeText(details.this, "Not Available", Toast.LENGTH_SHORT).show();
                    }else
                    {
                        Toast.makeText(details.this, "Available", Toast.LENGTH_SHORT).show();
                    }

                }

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

                }
            });

        }
    });

3 个答案:

答案 0 :(得分:1)

从外观上,您正在尝试检查是否有一个孩子,该孩子的order/0checkIn下有特定的productNameRequests。在当前数据结构中,您可以执行以下操作:

Query userQuery = database.getInstance().getReference().child("Requests")
        .orderByChild("order/0");
userQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            String type = snapshot.child("checkIn").getValue().toString();
            String type2 = snapshot.child("productName").getValue().toString();
            if(type.equals("Saturday, April 20, 2019") && type2.equals("The Mansion")) {
                Toast.makeText(details.this, "Not Available", Toast.LENGTH_SHORT).show();
            }
            else {
                Toast.makeText(details.this, "Available", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException()
    }
});

与您的代码不同:

  • 我在onDataChange内有一个循环,因为查询可以有多个结果。
  • 我对日期进行了硬编码,以排除由您在文本视图中输入数据的方式引起的问题。
  • 我会处理onCancelled,因为忽略错误只是一个坏主意。

更有效的方法是让Firebase执行部分查询,如下所示:

Query userQuery = database.getInstance().getReference().child("Requests")
        .orderByChild("order/0/checkIn").equalTo("Saturday, April 20, 2019");
userQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            String type2 = snapshot.child("productName").getValue().toString();
            if(type2.equals("The Mansion")) {
                Toast.makeText(details.this, "Not Available", Toast.LENGTH_SHORT).show();
            }
            else {
                Toast.makeText(details.this, "Available", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException()
    }
});

在这里更改是:

  • 我将部分支票移到了查询中,以便Firebase可以在服务器上执行该过滤器。这意味着它必须下载更少的数据到客户端,从而使其更快,更便宜。
  • 您仍然需要过滤客户端的第二个值,因为Firebase查询只能对一个属性进行排序/过滤。有关更多信息,请参见Query based on multiple where clauses in Firebase

请注意,您正在查询双嵌套数据。尽管您可以将其用于特定订单(在本示例中为orders/0),但如果请求中可以有多个订单,则Firebase将无法在所有订单中进行查询。

有关此内容和解决方案的更多信息,请参见:Firebase Query Double Nested

我还建议您阅读有关建模类别的答案,因为我觉得您很快就会需要:Firebase query if child of child contains a value

答案 1 :(得分:0)

在存储数据时,需要将用户电子邮件ID作为第一个参数,以便您可以根据用户访问数据。

{"reuest":{"xyz@gmail.com":{"orders":[{"checkin":"21:29"},{"checkin":"2:19"}]},"abc@gmail.com":{"orders":[{"checkin":"21:29"},{"checkin":"2:19"}]}}}

答案 2 :(得分:0)

Finally found a solution on my problem.

        btnAvailability.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Query userQuery = database.getInstance().getReference().child("Requests")
                    .orderByChild("order/0/checkIn").equalTo(checkInTV.getText().toString());
            userQuery.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
                        String type2 = snapshot.child("order/0/productName").getValue().toString();
                        if(type2.equals(beach_name.getText().toString())) {
                            Toast.makeText(details.this, "Not Available", Toast.LENGTH_SHORT).show();
                        }
                        else {
                            Toast.makeText(details.this, "Available", Toast.LENGTH_SHORT).show();
                        }
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    throw databaseError.toException();
                }
            });

        }
    });