【问题标题】:How to retrieve data from firebase in android如何从android中的firebase检索数据
【发布时间】:2020-07-06 05:35:21
【问题描述】:

我正在为 firebase 制作一个管理面板应用程序。 但我无法从 firebase 检索管理员用户的数据。 当我按下登录按钮时应用程序崩溃。 有人可以提供从我的数据库中检索管理员数据的方法,并检查它是否与用户输入的凭据匹配。


import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.capi.ccecommerceadmin.Model.Admin;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

public class LoginActivity extends AppCompatActivity
{
    Button signIn;
    EditText email, password;
    String adminemail;

    FirebaseAuth auth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        signIn = findViewById(R.id.login_btn);
        email = findViewById(R.id.login_email);
        password = findViewById(R.id.login_password);

        auth = FirebaseAuth.getInstance();

        final String str_email = email.getText().toString();
        final String str_password = password.getText().toString();

        signIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getAdmin(str_email, str_password);
            }
        });
    }

    private void getAdmin(final String str_email, final String str_password)
    {

        Query query = FirebaseDatabase.getInstance().getReference("Admins").orderByChild("isAdmin").equalTo(true);
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                Admin admin = snapshot.getValue(Admin.class);

                adminemail = admin.getEmail();
                if (adminemail.equals(str_email))
                {
                    auth.signInWithEmailAndPassword(str_email, str_password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful())
                            {
                                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                                startActivity(intent);
                            }
                            else
                            {
                                Toast.makeText(LoginActivity.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                }
                else
                {
                    Toast.makeText(LoginActivity.this, adminemail+" and "+str_email, Toast.LENGTH_SHORT).show();
                }
            }

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

            }
        });
    }
} 

我是安卓编程新手...

如果你想要其他课程,我也会发布它...................................... ......

.................................................. ..................................................... ..

这是我的数据库结构: https://i.stack.imgur.com/Ftt15.png

这是我的堆栈竞赛:

Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
       at com.capi.ccecommerceadmin.LoginActivity$2.onDataChange(LoginActivity.java:65)
       at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
       at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
       at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
       at android.os.Handler.handleCallback(Handler.java:751)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6816)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1567)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1455)
2020-07-06 10:59:38.422 1839-27996/? E/KioskModeService: There's no matched data
2020-07-06 10:59:38.440 1839-27996/? E/KioskModeService: There's no matched data
2020-07-06 10:59:38.493 1839-27996/? E/SemDvfsHintManager:  mHintTimeout : 500
2020-07-06 10:59:38.496 1839-27996/? E/ActivityManager: Found activity ActivityRecord{8dd224ad0 u0 com.capi.ccecommerceadmin/.SplashActivity t2398 f} in proc activity list using null instead of expected ProcessRecord{efa2eb4 8057:com.capi.ccecommerceadmin/u0a314}
2020-07-06 10:59:38.515 1839-1858/? E/ViewRootImpl: sendUserActionEvent() returned.
2020-07-06 10:59:38.592 1839-3440/? E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 104)
2020-07-06 10:59:38.597 1839-3440/? E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 108)
2020-07-06 10:59:38.598 9316-9316/? E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 92)
2020-07-06 10:59:38.614 755-843/? E/PBSessionCacheImpl: sessionId[3322118973208456] not persisted.
2020-07-06 10:59:38.665 1839-1943/? E/InputDispatcher: channel ~ Channel is unrecoverably broken and will be disposed!
2020-07-06 10:59:38.930 1839-1865/? E/WindowManager: Unhandled exception in Window Manager
   java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
       at java.util.ArrayList.get(ArrayList.java:411)
       at com.android.server.wm.WindowAnimator.updateAppWindowsLocked(WindowAnimator.java:230)
       at com.android.server.wm.WindowAnimator.animateLocked(WindowAnimator.java:1003)
       at com.android.server.wm.WindowAnimator.-wrap0(WindowAnimator.java)
       at com.android.server.wm.WindowAnimator$1.doFrame(WindowAnimator.java:185)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:928)
       at android.view.Choreographer.doCallbacks(Choreographer.java:705)
       at android.view.Choreographer.doFrame(Choreographer.java:637)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:916)
       at android.os.Handler.handleCallback(Handler.java:751)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:154)
       at android.os.HandlerThread.run(HandlerThread.java:61)
       at com.android.server.ServiceThread.run(ServiceThread.java:46)

【问题讨论】:

  • 堆栈跟踪在哪里
  • 等一下,我发帖
  • 记录这个 admin.getEmail() 并检查它返回的内容

标签: android firebase firebase-realtime-database


【解决方案1】:

所以我们可以提供更准确的答案,您应该发布您的堆栈跟踪。通过查看您的代码,我认为您的应用程序崩溃的原因是您的函数收到的电子邮件和密码是 null。首先,您在电子邮件和密码前面使用final关键字,这意味着该值不能修改。其次,您在 onCreate 方法上初始化变量,这意味着它们不应该有任何值(它们应该为空)。

final String str_email = email.getText().toString();
final String str_password = password.getText().toString();

最后,您应该在每次按下按钮时从编辑文本中检索值,这样您就可以获得用户在其中输入的最新信息。您必须对您的输入执行一般验证,例如值是否不同于 null 并且它们的长度大于 3(此数字根据应用程序的规范而变化)或者他输入的电子邮件是否是有效的电子邮件。

signIn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String str_email = email.getText().toString();
        String str_password = password.getText().toString();
        if (str_email != null && str_email != null) {
            if (str_email.length() > 3 && str_password.length() > 3) {
                getAdmin(str_email, str_password);
            }
        }
    }
});

注意,上面的代码只是一个例子。我还没有测试过,您应该根据电子邮件/密码是否有效向用户显示消息。

【讨论】:

  • 它还在崩溃
  • 它表示字符串管理员电子邮件为空。检查是否有任何数据从 firebase 返回。特别是如果字符串 adminemail 是否为空。
  • 您可以通过查看我给出的数据库结构来发送代码
【解决方案2】:

如果您使用的是 firebase 实时数据库,那么您可以按照这个简单的策略通过遍历 firebase 子项进行注册:

 DatabaseReference data=FirebaseDatabase.getInstance().getReference("user");

 data.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            int num=0;
            if(snapshot.exists()
            {
            for(DataSnapshot ds:snapshot.getChildren())
            {
                if(ds.child("email).getValue().toString().equals(email)&&ds.child("password").getValue().toString().equals(password))
                {
                   //Do Login
                   num=1;
                 }
            }
           }
        if(num==0)
            //print Invalid credentials
       }
        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多