我在Stackoverflow上是一个新手,在编程上还是一个新手。
我正在使用Firebase身份验证和Firebase实时数据库为Android创建一个应用程序。身份验证还可以,我正在用一个类很好地编写数据。
问题是我的class1读取了数据,它在我的文本视图中什么都不显示。 我在哪里错了?
我看到很多人遇到同样的麻烦,但是我在程序上找不到任何错误。
ondatachange吐司正在工作,当我尝试从我的http url读取数据时,我只能读取第一个孩子。
MainActivity.java:
insira o código aquipackage com.chruscinski.teste6; import... public class MainActivity extends AppCompatActivity {
// classes e atributos AUTENTICAÇÃO
private FirebaseAuth mFirebaseAuth; // instancia a classe firebaseauth (cria objeto/variável do mesmo tipo da classe)
private FirebaseAuth.AuthStateListener mAuthStateListener;// cria objeto/variável para armazenar o estado do listener da autenticação
public static final int RC_SIGN_IN = 1;//bandeira, não entendi direito como funciona isso ainda
//classes e atributos DATABASE
private FirebaseDatabase mFirebaseDatabase; //cria um objeto da classe FirebaseDatabaseAPI -> é o ponto de aceso do aplicativo ao database -> instancia
private DatabaseReference mDatabaseRef1; // cria um objeto de referencia do database da classe DatabaseReferenceAPI-> é o endereço, a referencia do Database
private ValueEventListener mValueEventListener;
// >>>>>>>>>>>>>>>ONCREATE<<<<<<<<<<<<<<<<<
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//AUTENTICAÇÃO
mFirebaseAuth = FirebaseAuth.getInstance();// inicia o objeto mFirebaseAuth
//DATABASE
mFirebaseDatabase = FirebaseDatabase.getInstance();//jeito mais longo em 2 linhas
mDatabaseRef1 = mFirebaseDatabase.getReference().child("cadastros");// faz referencia a uma parte específica do database
//mDatabaseRef1 = FirebaseDatabase.getInstance().getReference().child("cadastros"); // cria um filho ao objeto de referencia e atualiza o referencial
//AUTENTICAÇÃO inicia o listener do estado da autenticação
mAuthStateListener = new FirebaseAuth.AuthStateListener() {...}
//LER DADOS DATABASE
mValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
TextView t = (TextView)findViewById(R.id.textView2);
classe1 cla = dataSnapshot.getValue(classe1.class);
t.setText(cla.getCampo1());
Toast.makeText(MainActivity.this, "ON DATA CHANGE",Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(MainActivity.this, "ERRO.",Toast.LENGTH_SHORT).show();
}
};
mDatabaseRef1.addValueEventListener(mValueEventListener);
}
// MÉTODO PARA FAZER LOGOUT DDA AUTENTICAÇÃO
public void fsignOut(View view) {...}
// MÉTODO PARA ENVIAR DADOS AO FIREBASE USANDO A classe1
public void enviardata(View view) {
EditText edt1 = findViewById(R.id.edt1);
EditText edt2 = findViewById(R.id.edt2);
EditText edt3 = findViewById(R.id.edt3);
String sedt1 = edt1.getText().toString();
String sedt2 = edt2.getText().toString();
String sedt3 = edt3.getText().toString();
classe1 cla = new classe1(sedt1, sedt2, sedt3);
mDatabaseRef1.push().setValue(cla);
Toast.makeText(MainActivity.this, "SUCESSO", Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {...}
@Override
protected void onResume() {...}
}
classe1.java我用来写数据,但我想从中读取:
package com.chruscinski.teste6; import... com.google.firebase.database.IgnoreExtraProperties; @IgnoreExtraProperties public class classe1 {
public String campo1;
public String campo2;
public String campo3;
public classe1() {
// Default constructor required for calls to DataSnapshot.getValue(com.chruscinski.teste6.User.class)
}
public classe1(String campo1,String campo2,String campo3) {
this.campo1 = campo1;
this.campo2 = campo2;
this.campo3 = campo3;
}
public String getCampo1() {return campo1;}
public void setCampo1(String campo1) {this.campo1 = campo1;}
public String getCampo2() {return campo2;}
public void setCampo2(String campo2) {this.campo2 = campo2;}
public String getCampo3() {return campo3;}
public void setCampo3(String campo3) {this.campo3 = campo3;}
} tks
答案 0 :(得分:1)
感谢@GastónSaillén,@ AlexMamo,@ KostasPoime的帮助。幸运的是,我以@JuniaMontana的示例修复了我的代码。 现在,这段代码可以编写和读取类的参数,并在按下按钮后显示一个textview的所有子级及其属性。下一步是下载带有该信息的txt文件,但尚未实现。
代码在这里正常工作。
public class MainActivity extends AppCompatActivity {
// atributos AUTENTICAÇÃO
private FirebaseAuth mFirebaseAuth; // instancia a classe firebaseauth (cria objeto/variável do mesmo tipo da classe)
private FirebaseAuth.AuthStateListener mAuthStateListener;// cria objeto/variável para armazenar o estado do listener da autenticação
public static final int RC_SIGN_IN = 1;//bandeira, não entendi direito como funciona isso ainda
//atributos DATABASE
private FirebaseDatabase mFirebaseDatabase; //cria um objeto da classe FirebaseDatabaseAPI -> é o ponto de aceso do aplicativo ao database -> instancia
private DatabaseReference mDatabaseRef1; //*** cria um objeto de referencia do database da classe DatabaseReferenceAPI-> é o endereço, a referencia do Database
private ValueEventListener mValueEventListener;//***
// >>>>>>>>>>>>>>>ONCREATE<<<<<<<<<<<<<<<<<
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//AUTENTICAÇÃO
mFirebaseAuth = FirebaseAuth.getInstance();// inicia o objeto mFirebaseAuth
//DATABASE
this.mDatabaseRef1 = FirebaseDatabase.getInstance().getReference().child("cadastros"); // cria um filho ao objeto de referencia e atualiza o referencial
// mDatabaseRef1.child(uId).setValue("value1");
// AUTENTICAÇÃO inicia o listener do estado da autenticação
mAuthStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {// informa se o usuario está autenticado no momento
FirebaseUser user = firebaseAuth.getCurrentUser(); //cria a variavel user para armazenar o status conectado ou desconectado
if (user != null) {// usuario está autenticado
// Toast.makeText(MainActivity.this, "You're now signed in.", Toast.LENGTH_SHORT).show();
}
else { // usuario nao esta autenticado
startActivityForResult(
AuthUI.getInstance()// inicia a activity de login gerada automaticamente pelo firebase
.createSignInIntentBuilder()
.setIsSmartLockEnabled(false)
.setAvailableProviders(Arrays.asList(
new AuthUI.IdpConfig.EmailBuilder().build(),
new AuthUI.IdpConfig.GoogleBuilder().build()
//new AuthUI.IdpConfig.FacebookBuilder().build(),
//new AuthUI.IdpConfig.TwitterBuilder().build(),
//new AuthUI.IdpConfig.GitHubBuilder().build(),
//new AuthUI.IdpConfig.PhoneBuilder().build(),
//new AuthUI.IdpConfig.AnonymousBuilder().build()
))
.build(),
RC_SIGN_IN //bandeira
);
}
}
};
//LER DATABASE
//lets initialize the valueEventListener
this.mValueEventListener = getClasse1Information();
//now lets attach the valueEventListener
this.mDatabaseRef1.addValueEventListener(mValueEventListener);
}
//Now, lets create the method getClasse1Information() which will return ValueEventListener
// MÉTODO PARA RECEBER DADOS DO FIREBASE USANDO A classe1
private ValueEventListener getClasse1Information(){
atualizaRef1();//atualiza a mDatabaseRef1
return mValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//now we'll have to iterate over the data on the firebase
for(DataSnapshot snapshot: dataSnapshot.getChildren()){
if(snapshot != null){
// call your class here and register it
classe1 cla = snapshot.getValue(classe1.class);
// now just show the value
if(cla != null) {
String cmp1 = cla.getCampo1();
String cmp2 = cla.getCampo2();
String cmp3 = cla.getCampo3();
TextView t = (TextView)findViewById(R.id.textView2);
t.append("cmp1: " + cmp1 + ", cmp2: " + cmp2 + ", cmp3: " + cmp3);
t.append("\n");
t.append("\n");
//t.setText(cmp1 + cmp2 + cmp3);
//Toast.makeText(MainActivity.this, "cmp1: " + cmp1 + ",cmp2: " + cmp2 + ",cmp3: " + cmp3, Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
}
// MÉTODO PARA FAZER LOGOUT DDA AUTENTICAÇÃO
public void fsignOut(View view) {
AuthUI.getInstance()
.signOut(this)
.addOnCompleteListener(new OnCompleteListener<Void>() {
public void onComplete(@NonNull Task<Void> task) {
}
});
}
// MÉTODO PARA ENVIAR DADOS AO FIREBASE USANDO A classe1
public void enviardata(View view) {
atualizaRef1();//atualiza a mDatabaseRef1
EditText edt1 = findViewById(R.id.edt1);
EditText edt2 = findViewById(R.id.edt2);
EditText edt3 = findViewById(R.id.edt3);
String sedt1 = edt1.getText().toString();
String sedt2 = edt2.getText().toString();
String sedt3 = edt3.getText().toString();
classe1 cla = new classe1(sedt1, sedt2, sedt3);
mDatabaseRef1.push().setValue(cla);
//mDatabaseRef1.child("filho").setValue(cla);
Toast.makeText(MainActivity.this, "SUCESSO", Toast.LENGTH_SHORT).show();
}
// MÉTODO PARA ATUALIZAR A mDatabaseRef1 CRIANDO CHILD COM ID DO USUARIO
public void atualizaRef1(){
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String uNome = user.getDisplayName();
String uId = user.getUid();
String uEmail = user.getEmail();// email não funciona não sei por que
mDatabaseRef1 = FirebaseDatabase.getInstance().getReference().child("cadastros").child(uId);
}
@Override
protected void onPause() {
super.onPause();
mFirebaseAuth.removeAuthStateListener(mAuthStateListener); // remove o listener da autenticação
}
@Override
protected void onResume() {
super.onResume();
mFirebaseAuth.addAuthStateListener(mAuthStateListener); // adiciona o listener da autenticação
}
}
我的班级是一样的
package com.chruscinski.teste6; import com.google.firebase.database.IgnoreExtraProperties;@IgnoreExtraProperties public class classe1 {
public String campo1;
public String campo2;
public String campo3;
public classe1() {
// Default constructor required for calls to DataSnapshot.getValue(com.chruscinski.teste6.User.class)
}
public classe1(String filho1,String filho2,String filho3) {
this.campo1 = filho1;
this.campo2 = filho2;
this.campo3 = filho3;
}
public String getCampo1() {return campo1;}
public void setCampo1(String campo1) {this.campo1 = campo1;}
public String getCampo2() {return campo2;}
public void setCampo2(String campo2) {this.campo2 = campo2;}
public String getCampo3() {return campo3;}
public void setCampo3(String campo3) {this.campo3 = campo3;}
}
答案 1 :(得分:0)
嗨Reafael Bandera Chruscinski。我强烈建议您阅读Firebase文档。但是,请检查以下内容以了解如何从Firebase读取数据并获得有关Firebase数据库入门的基本知识:
创建了一个类后,说Post,并提供类变量说,
字符串postId; 弦柱; 字符串userEmail; 字符串userImage; 字符串datePosted;
现在,在您的Firebase数据库中,必须确保使用相同的变量构建数据库,例如:
-user_post(database_name)
-key(userEmail)
postId:"someId"
post:"some posts"
datePosted:"some date"
userImage:"userImage url"
好吧!你明白了。现在获取数据所有您需要做的是在mainActivity / fragment中创建DatabaseReference和ValueEventListener的引用。查看代码以了解其工作原理:
MainActivity /片段内部
private DatabaseReference databaseRef;
private ValueEvenetListener valueEventListener;
@Override
public void onCreate(@Nullable Bundle savedInstanceState){
// initializing the databaseRef by hooking it up with the Firebase database.
// Note: if you are using user's email as key to your database, make sure
// you encode the email.
this.databaseRef = FirebaseDatabase.getInstance().getReference()
.child(DATABASE_NAME).child(DATABASE_KEY);
//lets initialize the valueEventListener
this.valueEventListener = getPostInformation();
//now lets attach the valueEventListener
this.databaseRef.addValueEventListener(valueEventListener);
}
//Now, lets create the method getPostInformation() which will return ValueEventListener
private ValueEventListener getPostInformation(){
return new ValueEventListener(){
@Override
public void onDataChanged(@Nullable DataSnapshot dataSnapshot){
//now we'll have to iterate over the data on the firebase
// you've missed this part in your code
//so
for(DataSnapshot snapshot: dataSnapshot.getChildren()){
if(snapshot != null){
// call your class here and register it
Post post = snapshot.getValue(Post.class);
// now just show the value
if(post != null){
String id = post.getId();
String userEmail = post.getUserEmail();
String userImage = post.getUserImage();
String date = post.getDatePosted();
Toast.makeText(getActivity(), "Id: " + id + ",Email: " + userEmail + ",Image: " + userImage + ", Date: " + date, Toast.LENGTH_SHORT).show();;
}
}
}
}
}
}
就是这样。让我知道,如果您现在可以读取该值。祝你幸福。