我的firebase中有以下数据结构。我正在实施一个基于优惠券的系统,您可以在对话框中输入代码,并在整个数据库中搜索。所以我一直试图找出这个,但我还没有找到可以搜索代码的完美查询,如果找到,那么也可以获得所有其他子值。
以下是我一直在尝试的代码:
private void couponsearch() {
final EditText taskEditText = new EditText(this);
AlertDialog.Builder dialog = new AlertDialog.Builder(this)
.setTitle("Akiba Yangu")
.setMessage("Enter Akiba Code Here.")
.setIcon(R.drawable.akyi)
.setView(taskEditText).setPositiveButton("SAVE",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
String stringe = taskEditText.getText().toString();
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("codes").orderByChild("code").equalTo(stringe).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Coupons coo = dataSnapshot.getValue(Coupons.class);
String name = dataSnapshot.getKey();
int codez = coo.getValuee();
code.setText(name);
if(dataSnapshot != null && dataSnapshot.getChildren().iterator().hasNext()){
for(DataSnapshot ds : dataSnapshot.getChildren()) {
codegotten();
}
}else {
nocode();
}
int val = coo.getValuee();
Akibasavings as = new Akibasavings();
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
System.out.println(val);
code.setText(name);
as.setName(name);
as.setAmount(val);
final Firebase ref = new Firebase("https://akiba-c9600.firebaseio.com/");
Firebase newRef = ref.child("Savings"+uid).push();
newRef.setValue(as);
sendNotification();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
public void onCancelled(FirebaseError firebaseError) {
//Username Does Not Exist
}
});
}
});
dialog.show();
}
我想搜索代码,检查它是否真的存在:如果它存在,我还需要获取所有其他值,即每个子节点中有三个节点。代码,品牌,价值。在检查代码存在之后,我还想获得与之相关的其他值。此致
答案 0 :(得分:1)
您需要的是Query
。
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
Query mQuery = mDatabase.child("codes").orderByChild("code").equalTo(stringe);
mQuery.addListenerForSingleValueEvent(new ValueEventListener() {
// use single value event listener to detach listener immediately after query
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
// code exists, cast your data to relevant object
// note that if multiple entries exists, you need to loop through them
} else {
// code does not exists
}
}
});
阅读官方文件here。
请注意,您必须记住正确索引您的firebase! firebase上的查询与本地数据库查询不同。如果您没有索引您的firebase,查询会将codes
部分下的所有内容下载到用户手机中,然后在用户手机上进行本地搜索。这将消耗高带宽和内存。详细了解索引here。请阅读之前here索引的个人问题。
答案 1 :(得分:1)
对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。
您的onDataChange()
需要通过循环DataSnapshot.getChildren()
来处理快照包含结果列表的事实:
mDatabase.child("codes").orderByChild("code").equalTo(stringe).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
Coupons coo = childSnapshot.getValue(Coupons.class);
String name = childSnapshot.getKey();
int codez = coo.getValuee();
code.setText(name);
...
}
}
答案 2 :(得分:0)
为了实现这一点,我重新命名,通过添加一个名为coupons
的新节点来稍微改变数据库的结构。您的数据库应如下所示:
Firebase-root
--- coupons
TTUUPP: true
KKLLOO: true
要检查数据库中是否存在优惠券,只需在新创建的节点上添加一个侦听器并使用exists()
方法。这是Firebase中名为denormalization
的coomon实践,用于简化和减少查询和带宽。这就是你所需要的。