我正在开发一个预订移动应用程序,当我单击checkAvailability时,它将检查数据库中是否已存在数据。我的问题是,由于密钥是随机生成的,所以我不知道如何访问。我有很多类似的问题要解决,但没有解决方案对我有用。
Firebase数据库(屏幕截图):
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) {
}
});
}
});
答案 0 :(得分:1)
从外观上,您正在尝试检查是否有一个孩子,该孩子的order/0
在checkIn
下有特定的productName
和Requests
。在当前数据结构中,您可以执行以下操作:
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()
}
});
在这里更改是:
请注意,您正在查询双嵌套数据。尽管您可以将其用于特定订单(在本示例中为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();
}
});
}
});