【问题标题】:Retrieving a Single String Value Without Listening for Changes Using Firebase Realtime Database使用 Firebase 实时数据库在不监听更改的情况下检索单个字符串值
【发布时间】:2016-10-16 03:15:09
【问题描述】:

这是我当前的代码,但它不起作用。

我正在尝试使用 Firebase 实时数据库在不监听更改的情况下检索单个字符串值 (DATA)

但每当我运行此代码时,我都会收到 email[0] 为空。

而且Log.e("Email#1", "hello"); 从未出现在我的 logcat 中,让我感觉它从未真正进入 addListenerForSingleValueEvent()

 username=(EditText)findViewById(R.id.username);
     password=(EditText)findViewById(R.id.password);


    Firebase.setAndroidContext(this);
    final Button login=(Button)findViewById(R.id.loginbtn);
    final Firebase ref=new Firebase("//fir-learn-4991c.firebaseio.com/Users/Sriharsha/email");

    //assert login != null;
    assert login != null;
    login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            login.setText("Loading...");

           final FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference dref=database.getReference("email");

            final String user=username.getText().toString();
            final String[] email = new String[1];
            dref.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
                    Message post = dataSnapshot.getValue(Message.class);
                    Log.e("Email#1","hello yo");
                    //System.out.println(post);
                    //Map<String, Object> newPost = (Map<String, Object>) dataSnapshot.getValue();
                    email[0]=post.getEmail();

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    System.out.println("The read failed: " + databaseError.getCode());
                }
            });

这是类:消息:-

  public class Message {
    private  String email;
    public Message(){

    }
    public void message(String email)
    {
        this.email=email;
    }
    public String getEmail()
    {
        return email;
    }

 }

这是我的 Firebase 数据库: Firebase database picture

【问题讨论】:

  • 您的 dref 默认指向数据库的根目录。试试这个:DatabaseReference dref=database.getReference();并像这样设置监听器: dref.child("Users").addListenerForSingleValueEvent

标签: android firebase firebase-realtime-database


【解决方案1】:

您的侦听器设置在引用email(如果它不存在,因此不会触发侦听器),而您的电子邮件字符串似乎实际上存储在Users/&lt;username?&gt;/email。您可能需要相应地更改dref

【讨论】:

  • 所以你能建议我把它说出来吗,因为我已经尝试了你上面建议的所有可能的方法,但程序仍然没有进入听众!我需要帮助!!我正在尝试获取用户的电子邮件。
  • 我建议设置 dref = database.getReference("Users").child(user).child(email) 而不是你目前拥有的。
【解决方案2】:

我解决了。谢谢大家。我只是没有使用字符串数组,而是以不同的方法创建它以从 firebase 获取直接的字符串值。

Firebase ref=new Firebase("//fir-learn-4991c.firebaseio.com/Users/"+user);
            Firebase ref1=ref.child("email");
            final String pass=password.getText().toString();
            //Log.e("dref",dref.toString());
            ref1.addValueEventListener(new com.firebase.client.ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    String post=dataSnapshot.getValue(String.class);
                    Log.v("Email#1",post);
                    authentication(post,pass,user);
                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {

                }
            });

            Log.e("Email",""+ email[0]);
            Log.e("Ref",""+ ref);

        }

    });
}
public void newActivity(String email, String pass, String user)
{

    Intent intent = new Intent(Login.this, THSTheApp.class);
    intent.putExtra("email",email);
    intent.putExtra("UserName", user);
   intent.putExtra("Password", pass);// pass your values and retrieve them in the other Activity using keyName
    startActivity(intent);
}
public void x()
{
    Toast.makeText(Login.this, "There Was A Problem",
            Toast.LENGTH_SHORT).show();
    username.setText("");
    password.setText("");

}
public void authentication(final String email1, final String pass,final String user)
{
    mAuth = FirebaseAuth.getInstance();
    mAuth.signInWithEmailAndPassword(email1, pass).addOnCompleteListener(Login.this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(task.isSuccessful())
            {
                newActivity(email1,pass,user);
            }
            else if (!task.isSuccessful()) {
                x();
            }
        }
    });
}

}

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2022-10-04
    相关资源
    最近更新 更多