如何从选定的项目微调框(从Android Studio到Firebase)获取值

时间:2019-11-25 13:03:13

标签: java android firebase firebase-realtime-database

首先,感谢您点击我的问题,希望您能在这里帮助我解决问题:(

所以,我的问题是,我已经成功地从微调器“ productname”中获取数据,之后,我想从选定的项目侦听器中获取“ productprice”引用。如何获得“ product price”?因为当我运行应用程序时,它的作用力关闭了。希望你能理解我的意思:(

Click here to see my firebase db

package com.example.chocolatte;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import org.w3c.dom.Text;

import java.util.ArrayList;
import java.util.List;

public class transaction_page extends AppCompatActivity {

    private DatabaseReference mDatabase;

    Button bt_min, bt_plus, btOvo, btGopay, btCash, btCheckout;
    TextView txtSumProduct, txtProductSelected;
    String selectedproductprice, selectedproduct;
    Spinner productSpinner;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transaction_page);

        txtProductSelected = findViewById(R.id.txtProductSelected);

        mDatabase = FirebaseDatabase.getInstance().getReference();

        mDatabase.getRoot().child("PRODUCTS").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
                final List<String> products = new ArrayList<String>();

                for(DataSnapshot productsSnapshot: dataSnapshot.getChildren()) {
                    String productname = productsSnapshot.child("productname").getValue(String.class);
                    products.add(productname);
                }


                Spinner productSpinner = (Spinner) findViewById(R.id.spinner);
                final ArrayAdapter<String> productadapter = new ArrayAdapter<String>(transaction_page.this, android.R.layout.simple_spinner_dropdown_item, products);
                productadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                productSpinner.setAdapter(productadapter);

                productSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                        selectedproduct = productadapter.getItem(position);

                        mDatabase.equalTo(selectedproduct).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                               selectedproductprice = dataSnapshot.child("productprice").getValue().toString();
                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {

                            }
                        });

                        txtProductSelected.setText(selectedproduct + " (@" + selectedproductprice + ")");

                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {

                    }


                });
            }


            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }


        });


    }
}

这是针对报告

  

2019-11-25 19:55:44.720 26470-26470 / com.example.chocolatte E / AndroidRuntime:FATAL EXCEPTION:main       流程:com.example.chocolatte,PID:26470       java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.lang.String java.lang.Object.toString()”           在com.example.chocolatte.transaction_page $ 1 $ 1 $ 1.onDataChange(transaction_page.java:69)           com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database @@ 16.0.4:75)           com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database @@ 16.0.4:63)           com.google.firebase.database.core.view.EventRaiser $ 1.run(com.google.firebase:firebase-database @@ 16.0.4:55)           在android.os.Handler.handleCallback(Handler.java:789)           在android.os.Handler.dispatchMessage(Handler.java:98)           在android.os.Looper.loop(Looper.java:164)           在android.app.ActivityThread.main(ActivityThread.java:6541)           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

我期望的输出是

示例:

奶油巧克力(@ 10000)

1 个答案:

答案 0 :(得分:1)

您的引用位于根节点:

mDatabase = FirebaseDatabase.getInstance().getReference();

如果要检索productprice,则需要执行以下操作:

 mDatabase.child("PRODUCTS").child("PROD1").addValueEventListener(new ValueEventListener() {
    @Override
 public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
       selectedproductprice = dataSnapshot.child("productprice").getValue().toString();
       }

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

在此处添加对子项PROD1的引用,便可以检索子项productprice