如果存在值,则搜索firebase

时间:2017-09-13 13:00:48

标签: android firebase firebase-realtime-database

我的firebase中有以下数据结构。我正在实施一个基于优惠券的系统,您可以在对话框中输入代码,并在整个数据库中搜索。所以我一直试图找出这个,但我还没有找到可以搜索代码的完美查询,如果找到,那么也可以获得所有其他子值。

enter image description here

以下是我一直在尝试的代码:

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();
    }

我想搜索代码,检查它是否真的存在:如果它存在,我还需要获取所有其他值,即每个子节点中有三个节点。代码,品牌,价值。在检查代码存在之后,我还想获得与之相关的其他值。此致

3 个答案:

答案 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实践,用于简化和减少查询和带宽。这就是你所需要的。