在Firebase身份验证中使用getUid()函数的DatabaseException

时间:2016-12-24 04:46:50

标签: android firebase firebase-authentication

我正在尝试获取登录用户的ID并将其用于两个片段。在我首先使用的片段中,id被检索并正确存储在我的全局变量中,但是当我访问其他片段之后,我的应用程序崩溃说getUid()在另一个活动中生成空指针异常。

这是我的代码(除了不同的变量名之外,两个片段都有相同的代码.LDQApp是我的全局变量类)

public class RecruitmentFragment extends Fragment {

    private DatabaseReference mDatabase;

    EditText name_text,reg_text,year_txt, mob_txt,interest_txt;
    Button button;

    public RecruitmentFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,         Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_recruitment, container, false);

        name_text = (EditText)rootView.findViewById(R.id.editText2);
        reg_text = (EditText)rootView.findViewById(R.id.editText3);
        year_txt = (EditText)rootView.findViewById(R.id.editText4);
        mob_txt = (EditText)rootView.findViewById(R.id.editText5);
        interest_txt = (EditText)rootView.findViewById(R.id.editText6);

        button = (Button)rootView.findViewById(R.id.button2);

        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
       mDatabase=FirebaseDatabase.getInstance().getReference("recruitment");

    FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    LDQApp.uid = firebaseUser.getUid();

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            final String name,regNo,mobNo,interest;
            int year;

            name = name_text.getText().toString();
            regNo = reg_text.getText().toString();
            year = Integer.parseInt(year_txt.getText().toString());
            mobNo = mob_txt.getText().toString();
            interest = interest_txt.getText().toString();

            RecruitUser recruitUser = new RecruitUser(name,regNo,year,mobNo,interest);

            mDatabase.child(LDQApp.uid).setValue(recruitUser);

            mDatabase.child(LDQApp.uid).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    RecruitUser sUser = dataSnapshot.getValue(RecruitUser.class);
                    Toast.makeText(getContext(),"Submitted successfully",Toast.LENGTH_SHORT).show();

                    Log.d(TAG, "User name: " + name + ", Registration No: " + regNo);
                }

                @Override
                public void onCancelled(DatabaseError error) {
                    // Failed to read value
                    Log.w(TAG, "Failed to read value.", error.toException());
                }
            });
        }
    });

    return rootView;
}

}

这是请求的日志

Log

3 个答案:

答案 0 :(得分:0)

像这样获取FirebaseDatabase: 你不需要调用它并再次分配新值再次使用静态值;

public class Util {
private static FirebaseDatabase database;

public static FirebaseDatabase getDatabase() {
   if (database == null) {
      database = FirebaseDatabase.getInstance();
      database.setPersistenceEnabled(true);
   }
return database;
}

}

然后你可以像Util.getDatabase()那样访问它,或者你也可以保留一个静态布尔值,就像我在那个评论中说的那样,但这也避免了更多的代码冗余。

阅读documentation enter image description here

答案 1 :(得分:0)

这很简单,只需创建一个扩展Application

的新类
public class FireApp extends Application {
@Override
public void onCreate() {
    super.onCreate();
/* Enable disk persistence  */
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
 }

通过添加名称属性

将其连接到清单文件中的项目
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:name=".FireApp"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

答案 2 :(得分:0)

在使用Firebase身份验证时,请注意,一旦用户登录,用户将始终登录。不要将UID存储在这样的全局中。无论您需要知道用户的登录状态,通常都应使用AuthStateListener来跟踪该状态。您传递的回调将始终使用用户的正确登录状态进行调用,您可以相应地对该信息做出反应。

此外,如果您打算使用getCurrentUser()尝试获取当前登录的用户,请注意,当用户未登录时,它可以返回null。这可能是什么&#39;发生在你身上,为什么调用getUid()会为你抛出一个NPE。