我如何从Firebase DDBB中的某个对象获取ID /密钥,却知道该对象的所有其他数据?

时间:2019-06-01 08:44:28

标签: java android firebase firebase-realtime-database

我在RecyclerView内的fragment中有一个Activity,当我单击单击该RecyclerView的元素时,它通过{{1} }到另一个类,在该类中该对象的值将其应用于某些bundle

如果其他editText从另一个地方被调用而没有收到activity;手动获取我放入Editext中的数据,然后将它们放到一个新的Object中。之后,通过带有bundle的按钮将其上载到数据库。

但是如果接收到OnclickListener,并且EditText被接收到的数据填充,我希望Button进行更新。

我如何获得bundle(在创建该对象时)生成的key,却知道该对象的所有其他数据(在firebase中接收)

我需要做一个bundle传递该对象的所有数据吗?还是有另一种(更简便的)方式? 如果我需要通过所有数据进行查询,该怎么办? 我需要传递的不仅仅是标题(例如),因为不存在唯一值

添加/修改Java类:

query

“ Juego”类(对象):

public class Addmod extends AppCompatActivity {

    //Declaramos todos los objetos del XML mas algún string que servirá para pasar el valor luego a la BBDD

    Button btnok;
    Button btncan;
    Spinner spnplat;
    Spinner spnav;
    EditText txtitl;
    EditText txtvec;
    RadioGroup rdgpos;
    RadioGroup rdgfis;
    RadioButton rdbtn1;
    RadioButton rdbtn2;
    String poses;
    String fisic;
    String avanc;
    String plat;

    //y la referencia de base de datos

    DatabaseReference bbdd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_addmod);

        //Asignamos a cada cosa lo suyo

        btnok = (Button) findViewById(R.id.btnokadd);
        btncan = (Button) findViewById(R.id.btncanceladd);
        spnplat = (Spinner) findViewById(R.id.spnplatfo);
        spnav = (Spinner) findViewById(R.id.spnavan);
        txtitl = (EditText) findViewById((R.id.txtTitle));
        txtvec = (EditText) findViewById(R.id.txtveces);
        rdgpos = (RadioGroup) findViewById(R.id.rg);
        rdgfis = (RadioGroup) findViewById(R.id.rg2);
        poses = "No";
        fisic = "No";
        avanc = "Nulo";
        plat = "PC";

        //Le decimos dónde meter los datos en la BBDD

        bbdd = FirebaseDatabase.getInstance().getReference("juegos");

        // Creamos los listeners de los 2 botones importantes

        final Intent i = getIntent();
        final Juego jjj = i.getParcelableExtra("jue");

        if (jjj != null){
            txtitl.setText(jjj.getTitulo());
            txtvec.setText(jjj.getVeces());

        }

        btnok.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {

                // primero pasamos todos los valores a Strings

                String titlo = txtitl.getText().toString();
                String veces = txtvec.getText().toString();
                avanc = spnav.getSelectedItem().toString();
                plat = spnplat.getSelectedItem().toString();

                // comprobamos que el juego tenga título
                // si lo tiene, lo demás ya estaría puesto (aunque sea por defecto)

                if(!TextUtils.isEmpty(titlo)){


                    if (!avanc.equals("Pasado") && !avanc.equals("Completado")) {
                        txtvec.setText("0");
                        veces = "0";
                    }
                    Juego j = new Juego(titlo,plat,poses,fisic,avanc,veces);

                    if (jjj == null){

                        String clave = bbdd.push().getKey();
                        bbdd.child(clave).setValue(j);

                        Toast toast = Toast.makeText(getApplicationContext(),"Añadido con éxito",Toast.LENGTH_SHORT);
                        toast.show();
                        Addmod.this.finish();
                    }else{
                            // aquí irá el modificar en la BBDD
                        String clave = bbdd.getKey();
                        Toast toast = Toast.makeText(getApplicationContext(),"Modificado con éxito",Toast.LENGTH_SHORT);
                        toast.show();
                        Addmod.this.finish();
                    }

                }else{
                    Toast toast = Toast.makeText(getApplicationContext(),"Te falta el título",Toast.LENGTH_SHORT);
                    toast.show();
                }

            }
        });

    // El botón cancelar simplemente vuelve atrás sin realizar ningún cambio

        btncan.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Toast toast = Toast.makeText(getApplicationContext(),"Operación cancelada",Toast.LENGTH_SHORT);
                toast.show();

                Addmod.this.finish();
            }
        });

    // Aquí como en principio no querríamos añadir ninguna plataforma más, pasamos los valores a los spinner a través de un array.

        String[] plataformas = new String[] {"PC", "PS2", "PS3", "PS4", "N64", "Gamecube", "Wii", "WiiU", "NSwitch", "Xbox", "Xbox360", "XboxOne", "PSone", "GameBoy", "GBA", "DS", "3DS", "PSP", "PSVita"};
        String[] avance = new String[] {"Nulo", "Probado", "Intermedio", "Pasado", "Completado", "Irrelevante"};

        ArrayAdapter<String> adaptaforms = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, plataformas);
        ArrayAdapter<String> adaptavanc = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, avance);

        spnplat.setAdapter(adaptaforms);
        spnav.setAdapter(adaptavanc);
        if (jjj != null){
            switch (jjj.getPlataforma()){
                case "PC":
                    spnplat.setSelection(0);
                    break;
                case "PS2":
                    spnplat.setSelection(1);
                    break;
                case "PS3":
                    spnplat.setSelection(2);
                    break;
                case "PS4":
                    spnplat.setSelection(3);
                    break;
                case "N64":
                    spnplat.setSelection(4);
                    break;
                case "Gamecube":
                    spnplat.setSelection(5);
                    break;
                case "Wii":
                    spnplat.setSelection(6);
                    break;
                case "WiiU":
                    spnplat.setSelection(7);
                    break;
                case "NSwitch":
                    spnplat.setSelection(8);
                    break;
                case "Xbox":
                    spnplat.setSelection(9);
                    break;
                case "Xbox360":
                    spnplat.setSelection(10);
                    break;
                case "XboxOne":
                    spnplat.setSelection(11);
                    break;
                case "PSone":
                    spnplat.setSelection(12);
                    break;
                case "GameBoy":
                    spnplat.setSelection(13);
                    break;
                case "GBA":
                    spnplat.setSelection(14);
                    break;
                case "DS":
                    spnplat.setSelection(15);
                    break;
                case "3DS":
                    spnplat.setSelection(16);
                    break;
                case "PSP":
                    spnplat.setSelection(17);
                    break;
                case "PSVita":
                    spnplat.setSelection(18);
                    break;
                default:
                    spnplat.setSelection(0);
            }
            switch (jjj.getAvance()){
                case "Nulo":
                    spnav.setSelection(0);
                    break;
                case "Probado":
                    spnav.setSelection(1);
                    break;
                case "Intermedio":
                    spnav.setSelection(2);
                    break;
                case "Pasado":
                    spnav.setSelection(3);
                    break;
                case "Completado":
                    spnav.setSelection(4);
                    break;
                case "Irrelevante":
                    spnav.setSelection(5);
                    break;
                    default:
                        spnav.setSelection(0);
            }

        }

    }

    // Este método recoge el valor de los dos cuatro radiobutton y se encarga de pasarle la información como String (Si o No) cada vez que cambiamos cualquiera de los dos grupos

    public void checkButton(View v){

        int rdbposId = rdgpos.getCheckedRadioButtonId();
        rdbtn1 = findViewById(rdbposId);

        int rdbfisId = rdgfis.getCheckedRadioButtonId();
        rdbtn2 = findViewById(rdbfisId);

        //Toast toast = Toast.makeText(getApplicationContext(),"Ha seleccionado"+rdbtn1.getText()+" ",Toast.LENGTH_SHORT);
        //toast.show();
        poses = (rdbtn1.getText().toString());
        fisic = (rdbtn2.getText().toString());


    }

    // Este método de momento es basura, pero serviría para cada vez que alguien escoge las opciones del Spinner
    // "Nulo" o "irrelevante", automáticamente ponga a 0 el número de veces pasado (por si se ha modificado)
    // y de paso, cambia el valor al string que almacena en cada momento que se cambia el valor del spinner

    public void checkplat(View v){
        avanc = spnav.getSelectedItem().toString();

        if (!avanc.equals("Pasado")||!avanc.equals("Completado")){
            txtvec.setText("0");
            txtvec.setEnabled(false);
        }else{
            txtvec.setEnabled(true);
        }
    }
}


RecyclerView类(虽然是片段,但没有关系)


public class Juego implements Parcelable {
    private String titulo;
    private String plataforma;
    private String posesion;
    private String fisico;
    private String avance;
    private String veces;

    public Juego(){

    }

    public Juego(String titulo, String plataforma, String posesion, String fisico, String avance, String veces) {
        this.titulo = titulo;
        this.plataforma = plataforma;
        this.posesion = posesion;
        this.fisico = fisico;
        this.avance = avance;
        this.veces = veces;
    }

    protected Juego(Parcel in) {
        titulo = in.readString();
        plataforma = in.readString();
        posesion = in.readString();
        fisico = in.readString();
        avance = in.readString();
        veces = in.readString();
    }

    public static final Creator<Juego> CREATOR = new Creator<Juego>() {
        @Override
        public Juego createFromParcel(Parcel in) {
            return new Juego(in);
        }

        @Override
        public Juego[] newArray(int size) {
            return new Juego[size];
        }
    };

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getPlataforma() {
        return plataforma;
    }

    public void setPlataforma(String plataforma) {
        this.plataforma = plataforma;
    }

    public String getPosesion() {
        return posesion;
    }

    public void setPosesion(String posesion) {
        this.posesion = posesion;
    }

    public String getFisico() {
        return fisico;
    }

    public void setFisico(String fisico) {
        this.fisico = fisico;
    }

    public String getAvance() {
        return avance;
    }

    public void setAvance(String avance) {
        this.avance = avance;
    }

    public String getVeces() {
        return veces;
    }

    public void setVeces(String veces) {
        this.veces = veces;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(titulo);
        dest.writeString(plataforma);
        dest.writeString(posesion);
        dest.writeString(fisico);
        dest.writeString(avance);
        dest.writeString(veces);
    }
}

以及该回收站的Adapter类:


public class ListFragment extends Fragment implements View.OnClickListener{

    private RecyclerView rcv;
    private Adaptarecycler rAdapter;
    private RecyclerView.LayoutManager layoutManager;
    List<Juego> juegoss;
    //private ListView lstvw;

    DatabaseReference ddbbr;

    public ListFragment() {
        // Required empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_list, container, false);
        rcv = (RecyclerView) v.findViewById(R.id.recyclermini);
        rcv.setLayoutManager(new LinearLayoutManager(getContext()));
        juegoss = new ArrayList<>();
        rAdapter = new Adaptarecycler(getContext(),juegoss);
        rcv.setAdapter(rAdapter);
        recarga();


        /*
        lstvw = v.findViewById(R.id.lstvwlistamini);
        ddbbr = FirebaseDatabase.getInstance().getReference("juegos");
        ddbbr.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                ArrayAdapter<String> adapter;
                ArrayList<String> list = new ArrayList<String>();

                for (DataSnapshot datasnapshot: dataSnapshot.getChildren()) {

                    Juego juego =  datasnapshot.getValue(Juego.class);

                    String titulo = juego.getTitulo();
                    list.add(titulo);

                }
                adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,list);
                lstvw.setAdapter(adapter);

            }

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

            }
        });

        */

        return v;
    }

    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {

    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {



    }
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

    @Override
    public void onClick(View v) {


    }


    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
    public void recarga(){

        ddbbr = FirebaseDatabase.getInstance().getReference("juegos");
        ddbbr.addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                juegoss.clear();
                for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){
                    Juego j1 = dataSnapshot1.getValue(Juego.class);
                    juegoss.add(j1);
                }
                Collections.reverse(juegoss);
                rAdapter.notifyDataSetChanged();

            }

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

            }
        });
    }
}

我尝试通过标题传递查询,但是我想尽可能使用ID

0 个答案:

没有答案