我正在尝试获得儿童价值观,我已经在另一项活动中获得了一些价值观,但我没有任何问题。现在,我在新活动中创建了一个新的侦听器,但我没有得到值。我可以找到但无法传递给我的对象;我将放置一些代码来尝试解释我的意思。

我想用红色(编辑)
https://cdn.discordapp.com/attachments/375765058992603136/630091075226173479/unknown.png

错误

https://cdn.discordapp.com/attachments/375765058992603136/628991006217469953/unknown.png

我在对象上保存值(这是我的注册活动)

 private void salvarComerciantePt2() { //save store object

    if (dados != null && localizacao != null) {
        String categoria = spinnerCategoria.getSelectedItem().toString();//geting a category
        if(categoria != null){
                empresa.setNomeProprietario((String) dados.get("nomeProprietario"));
                empresa.setTelefone((String) dados.get("telefone"));
                empresa.setEmail((String) dados.get("email"));
                empresa.setCpf((String) dados.get("cpf"));
                empresa.setCnpj((String) dados.get("cnpj"));
                empresa.setSenha((String) dados.get("senha"));
                empresa.setLocalizacao(localizacao);
                empresa.setCategoria(categoria);
                empresa.setNomeEmpresa(inputNomeEmpresa.getText().toString());
                criaUsuarioFirebase(empresa.getEmail(), empresa.getSenha());// create firebase user
        }




    }
}


在这里,我试图从firebase中获取值(我想让孩子localizacao)

之后进行调试,我的代码崩溃

https://cdn.discordapp.com/attachments/375765058992603136/629010455473684493/unknown.png

private void recuperarLocalizacao(){

    DatabaseReference lojaRef = mDatabase
            .child("empresa")
            .child(idLoja) //idStore
            .child("localizacao");

    lojaRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                  local =  ds.getValue(Localizacao.class); // try to pass values to my Localizacao.java
                }

          //  Double latitude = local.getLatitude();

        }

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

        }
    });
}


在这里,我将值保存在Localizacao.java中(这是我的注册活动)

 private void autoComplete() {
    AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
            getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);

    autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME, Place.Field.LAT_LNG));

    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            // TODO: Get info about the selected place.
            Log.i("PlaceCerto", "Place: " + place.getName() + ", " + place.getId());
            Geocoder geocoder = new Geocoder(CadastroPt2Activity.this, Locale.getDefault());
            try {
                List<Address> listaEnderecos = geocoder.getFromLocationName(place.getName(), 1);
                if(listaEnderecos != null && listaEnderecos.size() >0){
                    Address address = listaEnderecos.get(0);
                    localizacao.setLatitude(place.getLatLng().latitude); // save latitude
                    localizacao.setLongitude(place.getLatLng().longitude); // save longitude
                    salvaLocal(address);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        @Override
        public void onError(Status status) {
            // TODO: Handle the error.
            Log.i("PlaceErrado", "An error occurred: " + status);
        }
    });
}

private void salvaLocal(Address address){// save place

    localizacao.setEstado(address.getAdminArea());
    localizacao.setCidade(address.getCountryName());
    localizacao.setCep(address.getPostalCode());
    localizacao.setBairro(address.getSubLocality());
    localizacao.setRua(address.getThoroughfare());
    localizacao.setNumero(address.getFeatureName());
}


Localizacao.java

package com.example.ezcompras.model;


公共课程Localizacao {

private String estado;
private String cidade;
private String bairro;
private String rua;
private String numero;
private String cep;
private Double latitude;
private Double longitude;

public Localizacao() {
}

public String getEstado() {
    return estado;
}

public void setEstado(String estado) {
    this.estado = estado;
}

public String getCidade() {
    return cidade;
}

public void setCidade(String cidade) {
    this.cidade = cidade;
}

public String getBairro() {
    return bairro;
}

public void setBairro(String bairro) {
    this.bairro = bairro;
}

public String getRua() {
    return rua;
}

public void setRua(String rua) {
    this.rua = rua;
}

public String getNumero() {
    return numero;
}

public void setNumero(String numero) {
    this.numero = numero;
}

public String getCep() {
    return cep;
}

public void setCep(String cep) {
    this.cep = cep;
}

public Double getLatitude() {
    return latitude;
}

public void setLatitude(Double latitude) {
    this.latitude = latitude;
}

public Double getLongitude() {
    return longitude;
}

public void setLongitude(Double longitude) {
    this.longitude = longitude;
}


}

在Firebase上创建用户(这是我的注册actitivy)

private void criaUsuarioFirebase (String email, String senha){

        mAuth.createUserWithEmailAndPassword(email, senha)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            //Log.d("TagCerta", "createUserWithEmail:success");
                            FirebaseUser user = mAuth.getCurrentUser();

                            empresa.salvar(); //writing values
                            Intent inicio = new Intent(CadastroPt2Activity.this, NavegationActivity.class);
                            String categoria = spinnerCategoria.getSelectedItem().toString();
                            inicio.putExtra("categoria", categoria);
                            startActivity(inicio);
                            finish();


                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w("TagErrada", "createUserWithEmail:failure", task.getException());
                            Toast.makeText(CadastroPt2Activity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();

                        }

                        // ...
                    }
                });
    }


这是我存储所有值的store.java。

public class Empresa {

private String uid;
private String nomeEmpresa;
private String nomeProprietario;
private String telefone;
private String email;
private String categoria;
private String descricao;
private String idUsuario;
private String senha;
private String tempo;
private String taxa;
private String cpf;
private String cnpj;
private Double precoEntrega;
private Localizacao localizacao;
private String urlImagem;


public Empresa() {
}

public void salvar(){
    setUid(UsuarioFirebase.getUsuarioAtual().getUid());
    DatabaseReference database = ConfiguracaoFirebase.getFirebaseDatabase();
    DatabaseReference reference;
    if(getCpf().equals("") || getCpf().equals(null)) {
        setCpf(null);
        reference = database.child("empresa").child(getUid());
    }
    else{

        reference = database.child("empresa").child(getUid());
    }

    reference.setValue(this);

}

public String getUid() {
    return uid;
}

public void setUid(String uid) {
    this.uid = uid;
}

public String getCategoria() {
    return categoria;
}

public void setCategoria(String categoria) {
    this.categoria = categoria;
}

public Localizacao getLocalizacao() {
    return localizacao;
}

public void setLocalizacao(Localizacao localizacao) {
    this.localizacao = localizacao;
}


public  String getDescricao() {
    return  descricao;
}

public void setDescricao(){
    this.descricao =descricao;
}

public String getTaxa(){
    return taxa;
}

public void setTaxa(){
    this.taxa = taxa;
}


public String getTempo(){
    return tempo;
}

public void setTempo(String tempo){
    this.tempo = this.tempo;
}

public String getNomeEmpresa() {
    return nomeEmpresa;
}

public void setNomeEmpresa(String nomeEmpresa) {
    this.nomeEmpresa = nomeEmpresa;
}

public String getNomeProprietario() {
    return nomeProprietario;
}

public void setNomeProprietario(String nomeProprietario) {
    this.nomeProprietario = nomeProprietario;
}

public String getTelefone() {
    return telefone;
}

public void setTelefone(String telefone) {
    this.telefone = telefone;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

@Exclude
public String getSenha() {
    return senha;
}

public void setSenha(String senha) {
    this.senha = senha;
}

public String getCpf() {
    return cpf;
}

public void setCpf(String cpf) {
    this.cpf = cpf;
}

public String getCnpj() {
    return cnpj;
}

public void setCnpj(String cnpj) {
    this.cnpj = cnpj;
}



public String getUrlImagem() {
    return urlImagem;
}

public String getIdUsuario() {
    return idUsuario;
}

public void setIdUsuario(String idUsuario) {
    this.idUsuario = idUsuario;
}

public Double getPrecoEntrega() {
    return precoEntrega;
}

public void setPrecoEntrega(Double precoEntrega) {
    this.precoEntrega = precoEntrega;
}

public void setUrlImagem(String urlImagem) {
    this.urlImagem = urlImagem;
}


}

这是我的json *编辑

 "empresa" : {
"7tQGfB7utBWZBtJM2XvuxMH57Sl1" : {
  "categoria" : "petshop",
  "cnpj" : "",
  "cpf" : "99999999999",
  "email" : "[email protected]",
  "localizacao" : {
    "bairro" : "Jardim Planalto de Viracopos",
    "cep" : "13056-016",
    "cidade" : "Brazil",
    "estado" : "São Paulo",
    "latitude" : -22.989735,
    "longitude" : -47.1418681,
    "numero" : "27",
    "rua" : "Rua Luzia Evangelista Eusébio"
  },
  "nomeEmpresa" : "mauro pet",
  "nomeProprietario" : "mauro",
  "pedidos" : {
    "-Lq7o5ykWNyGBcab6WkZ" : {
      "estado" : "Aguardando interação",
      "idPedido" : "-Lq7o5ykWNyGBcab6WkZ",
      "produto" : {
        "descricao" : "teste",
        "idProduto" : "-Lq7o5ykWNyGBcab6WkZ",
        "idUsuario" : "7tQGfB7utBWZBtJM2XvuxMH57Sl1",
        "nome" : "teste",
        "preco" : 10
      },
      "quantidade" : 1
    }
  },
  "telefone" : "+5519982674837",
  "uid" : "7tQGfB7utBWZBtJM2XvuxMH57Sl1"
},

最佳答案

您收到以下错误:


无法将java.lang.String类型的对象转换为com.example.ezcompras.model.Lojas类型


由于您正在使用以下参考资料:

DatabaseReference lojaRef = mDatabase
        .child("empresa")
        .child(idLoja) //idStore
        .child("localizacao");


这指向一个表示自身的节点,该节点本身是一个Localizacao对象。因为您正在遍历实际上是字符串的子级,所以会遇到该错误。因此,如果您要获取单个Localizacao对象,则无需循环,您只需简单地获取Localizacao对象,如下所示:

ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Localizacao localizacao = dataSnapshot.getValue(Localizacao.class);
        Log.d(TAG, localizacao.getCidade());
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
lojaRef.addListenerForSingleValueEvent(valueEventListener);


并在logcat中的结果将是:

Brazil

07-26 09:06