Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从Firebase实时数据库获取对象?_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 如何从Firebase实时数据库获取对象?

Android 如何从Firebase实时数据库获取对象?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,在我的应用程序中,我有一个存储用户信息的User类,我将其保存到Firebase实时数据库中,如下所示: mDbReference.child("UserData").child(getUser().getUid()).setValue(user); 现在,在应用程序的另一部分中,我想检索用户对象,但应用程序崩溃了。如果我使用snapshot.getValue().toString(),它可以工作,但我想将它保存在用户对象中,如下所示: Query usernameQuer

在我的应用程序中,我有一个存储用户信息的
User
类,我将其保存到
Firebase实时数据库中,如下所示:

mDbReference.child("UserData").child(getUser().getUid()).setValue(user);
现在,在应用程序的另一部分中,我想检索
用户
对象,但应用程序崩溃了。如果我使用
snapshot.getValue().toString()
,它可以工作,但我想将它保存在
用户
对象中,如下所示:

Query usernameQuery = fHelper.getDbReference().child("UserData")
                        .orderByChild("userName")
                        .equalTo(userCredentialEditText.getText().toString().trim());
    
                usernameQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        User user = (User) snapshot.getValue(User.class);
                        assert user != null;
                        Log.i("Snapshot", user.getUserEmail());
                    }
    
                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {
    
                    }
                });
我得到这个错误:

2021-04-19 22:40:34.769 15372-15372/com.outwire E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.outwire, PID: 15372
    java.lang.NullPointerException: println needs a message
        at android.util.Log.println_native(Native Method)
        at android.util.Log.i(Log.java:176)
        at com.outwire.login.LoginActivity$1.onDataChange(LoginActivity.java:173)
        at com.google.firebase.database.Query$1.onDataChange(Query.java:191)
        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:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:224)
        at android.app.ActivityThread.main(ActivityThread.java:7565)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

对Firebase数据库执行查询时,可能会有多个结果。因此,快照包含这些结果的列表。即使只有一个结果,快照也将包含一个结果列表

您的
onDataChange
需要通过循环
snapshot.getChildren()
来处理此列表,即使只有一个结果

比如:

Query usernameQuery = fHelper.getDbReference().child("UserData")
        .orderByChild("userName")
        .equalTo(userCredentialEditText.getText().toString().trim());

usernameQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot userSnapshot: snapshot.getChildren()) {
            User user = userSnapshot.getValue(User.class);
            assert user != null;
            Log.i("Snapshot", user.getUserEmail());
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException(); // never ignore errors
    }
});

欢迎来到堆栈溢出!确保在问题中包含堆栈跟踪。另外,您的标题似乎暗示您需要一个从Firebase读取数据的教程,但实际上您遇到了一个错误。您是否检查了
user.getUserEmail()
是否为null?@HenryTwist是的,对象的所有内容都为null,但如果我使用snapshot.getValue().toString())我可以打印信息它无法解析getResults()methodOops,这是一个打字错误
getChildren
是您要查找的内容。供将来参考:它工作得很好,只有一个问题。为什么在获取对象时必须迭代,而在调用getValue()时则不必迭代?哎呀,这是另一个输入错误。对此很抱歉。是的,我抓到了那个,但为什么在使用无参数的getValue时不必迭代呢?