从Firebase检索单一类型的对象

时间:2017-03-14 14:50:03

标签: android firebase firebase-realtime-database

我对Firebase有一个小问题。我有一个表示用户信息的对象和表示入口和出口的其他对象。问题是我只想提取存储在Firebase上的用户对象。有没有办法做到这一点?

谢谢。

这是我的Json

{
  "Entradas-123456789E": {
    "Entradas : 13-2-2017": {
      "DetallesMon Mar 13 12:03:17 GMT+01:00 2017": {
        "user": {
          "dni": "123456789E"
        }
      }
    }
  },
  "Salidas-123456789E": {
    "Salidas : 13-2-2017": {
      "DetallesMon Mar 13 20:06:46 GMT+01:00 2017": {
        "user": {
          "dni": "123456789E"
        }
      }
    }
  },
  "Usuario_123456789E": {
    "dni": "123456789E",
    "lastname": "Prueba Prueba2",
    "name": "Mireia",
    "password: "######"
  },
  "Usuario_536881138E": {
    "dni": "53688138E",
    "lastname": "Mheb",
    "name": "Antonia",
    "password:"######"
  }
}

这是代码

public class MainActivityFragment extends Fragment {

private Intent takePictureIntent;
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef;
private String pathFotoTemporal;
private static final int REQUEST_TAKE_PHOTO = 1;
private View view;
private String key;

//Expandable list Adapter
ExpandableListAdapter listAdapter;
ExpandableListView expListView;
List<String> listDataHeader;
HashMap<String, List<String>> listDataChild;

//Users
private List <User> items = new ArrayList<>();

//Obejeto a pasar
User user = new User();
String password;


//Buttons
private EditText TextPass;
private EditText TextDNI;
private Button fichar;

// Adding child data
List<String> top250 = new ArrayList<String>();


@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_main, container, false);
    LeerFirebase();

    //Button
    TextPass = (EditText) view.findViewById(R.id.IdpasswordUser);
    //TextDNI = (EditText) view.findViewById(R.id.DNI);

    // get the listview
    expListView = (ExpandableListView) view.findViewById(R.id.lvExp);

    // preparing list data
    prepareListData();

    listAdapter = new ExpandableListAdapter(getActivity(), listDataHeader, listDataChild);
    //expListView.setAdapter(listAdapter);

    // setting list adapter
    expListView.setAdapter(listAdapter);

    //Write in database mesage myRef.setValue("Hello, World!");

    //Call Button fichar
    fichar = (Button) view.findViewById(R.id.fichar);
    fichar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            key = TextDNI.getText().toString();
            password = TextPass.getText().toString();

            //SuperUser
            if(key.equalsIgnoreCase("********")&&password.equalsIgnoreCase("*******")){
                ((MainActivity) getActivity()).EditarUsuario();
                fichar.setVisibility(view.INVISIBLE);
                TextPass.setVisibility(view.INVISIBLE);
                TextDNI.setVisibility(view.INVISIBLE);
            }else{
                LeerFirebase();
            }

            //Para pasar de fragment hay que comprobar el dni y el password
            /*((MainActivity) getActivity()).AbrirFichar();
            fichar.setVisibility(view.INVISIBLE);
            TextPass.setVisibility(view.INVISIBLE);*/

        }
    });
    return view;
}

private void LeerFirebase() {
    myRef = database.getReference("Usuario" +"_"+ key+"/password");
    //+"/password"
    // Read from the database
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String value = dataSnapshot.getValue(String.class);
            password = TextPass.getText().toString();
            if(password.equalsIgnoreCase(value)){
                //Pasamos por pantalla
                Toast.makeText(getActivity(),"El usuario introducido es correcto",Toast.LENGTH_SHORT).show();
                //Pasamos al otro Fragment
                ((MainActivity) getActivity()).AbrirFichar(TextDNI.getText().toString());
                fichar.setVisibility(view.INVISIBLE);
                TextPass.setVisibility(view.INVISIBLE);
                TextDNI.setVisibility(view.INVISIBLE);
            }else {
                Toast.makeText(getActivity(),"El usuario introducido o la Contraseña no son correctos ",Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onCancelled(DatabaseError error) {
            Toast.makeText(getActivity(),"Hay un error de lectura ",Toast.LENGTH_SHORT).show();
        }
    });
}

//On start button is Visible
@Override
public void onStart() {
    final Button fichar = (Button) getView().findViewById(R.id.fichar);
    EditText getpassword = (EditText) getView().findViewById(R.id.IdpasswordUser);
    fichar.setVisibility(getView().VISIBLE);
    getpassword.setVisibility(getView().VISIBLE);
    super.onStart();
}


//List Adapter
private void prepareListData() {
    listDataHeader = new ArrayList<String>();
    listDataChild = new HashMap<String, List<String>>();

    // Adding child data
    listDataHeader.add("User Name");

    //Firebase carga

    DatabaseReference ListaRef = database.getReference();

    // Read from the database
    ListaRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // This method is called once with the initial value and again
            // whenever data at this location is updated.

            items.clear();
            User usuarios;

            for( DataSnapshot i : dataSnapshot.getChildren()) {
                usuarios = i.getValue(User.class);
                items.add(usuarios);
                top250.add(" " + usuarios.getName() + " " + usuarios.getLastname());
            }
            Toast.makeText(getContext(), "Se han bajado " + items.size() + " Usuario", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onCancelled(DatabaseError error) {
            Toast.makeText(getContext(), "Error descargando las recetas", Toast.LENGTH_SHORT).show();
        }
    });
        List<String> top = new ArrayList<String>();

    //Falta corregir no saca nada
        for(int i = 0 ; i < top250.size(); i++){
            if (top250.get(i).isEmpty()||top250.equals(null)||top250.get(i).equals(null)||top250.get(i).equalsIgnoreCase("null null")){
                System.out.println("Noooo");
        }else{
            top.add(top250.get(i));
        }
    }
        listDataChild.put(listDataHeader.get(0), top); // Header, Child data
}
}

2 个答案:

答案 0 :(得分:1)

Json改变并找到了

{
  "Records" : {
    "Enters" : {
      "Entradas-5123445B" : {
        "Entradas : 15-2-2017" : {
          "DetallesWed Mar 15 10:08:59 GMT+01:00 2017" : {
            "user" : {
              "dni" : "5123445B"
            }
          }
        }
      },
      "Entradas-5128445A" : {
        "Entradas : 15-2-2017" : {
          "DetallesWed Mar 15 10:11:17 GMT+01:00 2017" : {
            "user" : {
              "dni" : "5128445A"
            }
          }
        }
      }
    },
    "Exits" : {
      "Salidas-5123445B" : {
        "Salidas : 15-2-2017" : {
          "DetallesWed Mar 15 10:09:46 GMT+01:00 2017" : {
            "user" : {
              "dni" : "5123445B"
            }
          }
        }
      }
    }
  },
  "Users" : {
    "Usuario_5123445B" : {
      "dni" : "5123445B",
      "lastname" : "Apellido Apellidos",
      "name" : "Prueba",
      "password" : "######"
    },
    "Usuario_5128445A" : {
      "dni" : "5128445A",
      "lastname" : "Apellido mwk",
      "name" : "NjdNom",
      "password" : "######"
    }
  }
}

代码

public class MainActivityFragment extends Fragment {

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef;
    private View view;
    private String key;

    //Expandable list Adapter
    ExpandableListAdapter listAdapter;
    ExpandableListView expListView;
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;

    //Users
    private List <User> items = new ArrayList<>();

    //Obejeto a pasar
    User user = new User();
    String password;


    //Botones
    private EditText TextPass;
    private EditText TextDNI;
    private Button fichar;

    // Adding child data
    List<String> top250 = new ArrayList<String>();


    @Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_main, container, false);
        LeerFirebase();

        //Botones
        TextPass = (EditText) view.findViewById(R.id.IdpasswordUser);

        // get the listview
        expListView = (ExpandableListView) view.findViewById(R.id.lvExp);

        // preparing list data
        prepareListData();

        listAdapter = new ExpandableListAdapter(getActivity(), listDataHeader, listDataChild);

        // setting list adapter
        expListView.setAdapter(listAdapter);

        //Llamamos al boton fichar
        fichar = (Button) view.findViewById(R.id.fichar);
        fichar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                key = TextDNI.getText().toString();
                password = TextPass.getText().toString();
                //SuperUsuario
                if(key.equalsIgnoreCase("######")&&password.equalsIgnoreCase("#########")){
                    ((MainActivity) getActivity()).EditarUsuario();
                    fichar.setVisibility(view.INVISIBLE);
                    TextPass.setVisibility(view.INVISIBLE);
                    TextDNI.setVisibility(view.INVISIBLE);
                }else{
                    LeerFirebase();
                }

            }
        });
        return view;
    }

    private void LeerFirebase() {
        myRef = database.getReference("Usuario" +"_"+ key+"/password");
        // Read from the database
        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String value = dataSnapshot.getValue(String.class);
                password = TextPass.getText().toString();
                if(password.equalsIgnoreCase(value)){
                    //Pasamos por pantalla
                    Toast.makeText(getActivity(),"El usuario introducido es correcto",Toast.LENGTH_SHORT).show();
                    //Pasamos al otro Fragment
                    ((MainActivity) getActivity()).AbrirFichar(TextDNI.getText().toString());
                    fichar.setVisibility(view.INVISIBLE);
                    TextPass.setVisibility(view.INVISIBLE);
                    TextDNI.setVisibility(view.INVISIBLE);
                }else {
                    Toast.makeText(getActivity(),"El usuario introducido o la Contraseña no son correctos ",Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onCancelled(DatabaseError error) {
                Toast.makeText(getActivity(),"Hay un error de lectura ",Toast.LENGTH_SHORT).show();
            }
        });
    }

    //Al iniciarse crea el boton Visible
    @Override
    public void onStart() {
        final Button fichar = (Button) getView().findViewById(R.id.fichar);
        EditText getpassword = (EditText) getView().findViewById(R.id.IdpasswordUser);
        fichar.setVisibility(getView().VISIBLE);
        getpassword.setVisibility(getView().VISIBLE);
        super.onStart();
    }


    //List Adapter
    private void prepareListData() {
        listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String, List<String>>();

        // Adding child data
        listDataHeader.add("User Name");

        //Firebase carga

        DatabaseReference ListaRef = database.getReference("Users");

        // Read from the database
        ListaRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                items.clear();
                User usuarios;

                for( DataSnapshot i : dataSnapshot.getChildren()) {
                    usuarios = i.getValue(User.class);
                    items.add(usuarios);
                    top250.add(" " + usuarios.getName() + " " + usuarios.getLastname());
                }
                Toast.makeText(getContext(), "Se han bajado " + items.size() + " Usuario", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCancelled(DatabaseError error) {
                Toast.makeText(getContext(), "Error descargando las recetas", Toast.LENGTH_SHORT).show();
            }
        });

        listDataChild.put(listDataHeader.get(0), top250);
    }
}

谢谢,它有效。我留下结果以防万一有人需要在列表中获取信息,而firebase已经知道如何操作。

答案 1 :(得分:0)

您应该在两个父数组中对答案进行排序,如果您愿意,可以将它们称为“用户”和“记录”,然后在每个数组中放入相应的记录和您需要的记录

像这样:

json structure

然后使用Firebase,您只能提取“用户”对象,并使用其他对象中的gson进行解析,与您需要的每个用户进行迭代。