我想将文本与Firebase中的数据进行比较。下面是我的代码,它仅从ing01读取名称。但实际上我希望它从所有成分数据中读取,而不仅仅是ing01。请帮助我,谢谢。
final String dataCompare=sb.toString();//.replaceAll("\\s+","");
databaseReference = firebaseDatabase.getInstance().getReference().child("ingredients");//.child("ing01").child("iName");
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()){
String iName = ds.child("iName").getValue(String.class);
if(dataCompare.equals(iName)){
mResultEt.setText(dataCompare);
mStatusEt.setText("OK");
mStatusEt.setTextColor(Color.GREEN);
}
else{
mResultEt.setText(dataCompare);
mStatusEt.setText("Not OK");
mStatusEt.setTextColor(Color.RED);
}
}
代替firebaseDatabase.getInstance().getReference().child("ingredients").child("ing01").child("iName");
,使用firebaseDatabase.getInstance().getReference().child("ingredients");
获取所有成分
您可以使用第三方库,例如:Angularfire,这里有官方链接:https://github.com/angular/angularfire
检查此:
FirebaseDatabase.getInstance().getReference().child("ingredients").addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
String iName = childSnapshot.child("iName").getValue(String.class);
//Implement your logic here
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
}
);
这里您将获得所有ingredients
,并且通过迭代您将获得iName
。
但是根据您的实现逻辑。获取所有成分是没有用的,而是可以获取与compare
查询匹配的特定成分。尝试如下:
FirebaseDatabase.getInstance().getReference().child("ingredients").orderByChild("iName").equalTo(dataCompare).addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChildren()) {
mResultEt.setText(dataCompare);
mStatusEt.setText("OK");
mStatusEt.setTextColor(Color.GREEN);
} else {
mResultEt.setText(dataCompare);
mStatusEt.setText("Not OK");
mStatusEt.setTextColor(Color.RED);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
}
);
final String dataCompare=sb.toString();
databaseReference = firebaseDatabase.getInstance().getReference().child("ingredients");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String iName1 = dataSnapshot.child("ing01").child("iName");
String iName2 = dataSnapshot.child("ing02").child("iName");
//now here you can compare both the iName values with the dataCompare object.
}
}
**** EDIT ****
final String dataCompare=sb.toString();
Log.d("DataCompare: ", dataCompare);
databaseReference = firebaseDatabase.getInstance().getReference().child("ingredients");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.getChildren() == null) {
Log.d(TAG, "onDataChange: snapshot has no children");
} else {
int i = 1;
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String iName = ds.child("ing0" + i++).child("iName").getValue();
// if this doesn't work try this --
// String iName = ds.child("iName").getValue();
Log.d(TAG, "name value: " + iName);
if (iName.equals(dataCompare)) {
Log.d(TAG, "onDataChange: string equals");
} else {
Log.d(TAG, "onDataChange: strings are not equal");
}
}
}
}
}
在我编写的onDataChange()
方法内部:-
String iName = ds.child("ing0" + i++).child("iName").getValue();
这里我们正在读取当前位于“成分”处的数据快照的子对象“ ing01”(在循环的第一次迭代中),然后将“ iName”及其值读取到iName
字符串对象中。
对于每个循环,它将对dataSnapshot
的所有子代执行此操作,这意味着将对Firebase数据库中的所有数据执行此操作。