gpt4 book ai didi

android - Firebase Android,检查一个对象(有多个 child )是否存在

转载 作者:行者123 更新时间:2023-11-29 16:51:05 25 4
gpt4 key购买 nike

我正在使用 Firebase 数据库来存储用户的报告。每个用户只允许提交 10 份不同的报告。

在下面的示例中,我们有一个名为“Jasna Kuljancic”的用户提交了 3 份报告。

Image

我的问题是如何检查用户是否已经提交了特定报告?

我必须检查“location”、“mode”、“spinnerOne”的值,并将它们与用户刚刚输入的内容进行比较,如果它已经存在,那么不要添加到数据库中,如果是,那么添加它。这是我的尝试:

public void checkifentryExistofNot() {
uniqueID = mDatabaseReference.push().getKey();
fullname = “Jasna Kuljancic”;
CATEGORY = “Clinical First”);

final Report subreport = new Report(SELECTED_LOCATION,
locationEditText.getText().toString(),
modeEditText.getText().toString(),
Integer.parseInt(dateEditText.getText().toString()));

mDatabaseReference.child("Students Reports").child(fullname).child(CATAGORY).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int numberofCount = (int) dataSnapshot.getChildrenCount();
if (numberofCount == 0) {

mDatabaseReference.child("Students Reports").child(fullname).child(CATAGORY).child(uniqueID).setValue(subreport);

}

if (numberofCount != 0) {

for (DataSnapshot child : dataSnapshot.getChildren()) {
Report datareports = child.getValue(Report.class);
thelocation = datareports.getLocation();
themode = datareports.getMode();

if (thelocation.equals(locationEditText.getText().toString()) && themode.equals(modeEditText.getText().toString())) {
break;
} else {
mDatabaseReference.child("Students Reports").child(fullname).child(CATAGORY).child(uniqueID).setValue(subreport);
}
}
}
}

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

我的解决方案的问题是 for 循环将检查每个报告,并且在每种情况下它都会添加或不添加新报告,但这会在存在的报告数量上发生,并且它应该只执行一次。

换句话说,如果我们有 3 个条目,每次都不存在,它会提交报告 3 次(这还算不错)。但是如果它检查第一个报告并且它确实存在,循环将退出,因为我在那里有一个“中断”(这很好)但是假设第二个报告将是重复的,它已经将其添加到数据库中,因为第一个条目不是重复项。

我觉得我已经完成了这项工作,应该有一种更快的方法来完成这项工作。

最佳答案

Firebase 查询只能按单个属性排序/过滤。所以 Firebase 中没有 WHERE 子句。相反,您应该做的是耦合一个名为 location_mode_spinnerOne 的复合值。您的数据库结构应如下所示:

Firebase-root
|
-- Students Reports
|
-- Jasna Kuljancic
|
-- Clinical First
|
-- -KuVRQ4OjdfKXCNdLWzb
|
--- data: 3939393
|
--- location: "fifififi"
|
--- mode: "ododododo"
|
--- spinnerOne: "Asylum Hill Family Clinic"
|
--- location_mode_spinnerOne: "fifififi_ododododo_Asylum Hill Family Clinic"

您可能已经看到,我为每个特定类别添加了新的复合值 location_mode_spinnerOne。这意味着您可以根据这个新的 location_mode_spinnerOne 字段查询您的 Firebase 数据库。假设上面的数据库结构是正确的,请使用如下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference categoryRef = rootRef.child("Students Reports").child(fullname).child(CATAGORY);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String searchedText = "fifififi";

for(DataSnapshot ds : dataSnapshot.getChildren()) {
String location_mode_spinnerOne = ds.child("location_mode_spinnerOne").getValue(String.class);
if(!location_mode_spinnerOne.contains(searchedText)) {
categoryRef.child(uniqueID).setValue(subreport);
}
}
}

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

我给了你一个搜索fifififi关键字的例子。 searchedText 文本将是用户键入的精确搜索文本。

为了更好的理解,我建议你看这个tutorial .

关于android - Firebase Android,检查一个对象(有多个 child )是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46436233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com