Android在第一次运行时初始化firebase数据库

时间:2017-02-04 17:55:59

标签: android database firebase firebase-realtime-database firebase-authentication

任何人都可以帮助为每个新的经过身份验证的用户创建预定义的Firebase数据库,基本上我希望应用程序为每个新的uid创建具有预定义值的数据库。 我需要在第一次运行应用程序时才发生这种情况。

我的应用程序现在使用已经结构化的数据库运行没有问题...但在我尝试使我的应用程序创建该数据库而不是我之后我开始接收Null异常。

这是代码的一部分,我第一次运行应用程序后出现错误的部分,在Google登录消息出现或验证发生之前,应用程序开始阅读以下部分并收到NULL。

BluetoothStat.child("BluetoothStat").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            String value = dataSnapshot.getValue(String.class);
            bluetoothStatus.setText(value);

            if (value.equals("ON")){
                bConnect.setBackgroundResource(R.drawable.bluetooth_on);
                bluetoothBStatus = true;
            }
            else if (value.equals("OFF")){
                bConnect.setBackgroundResource(R.drawable.bluetooth_off);
                bluetoothBStatus = false;
            }

        }

这是我正在尝试预定义为我的应用程序的数据库

userUID = firebaseUser.getUid();

                    Engine = myRef.child("Users").child(userUID).child("Engine");
                    EngineStat = myRef.child("Users").child(userUID).child("EngineStat");
                    Bluetooth = myRef.child("Users").child(userUID).child("Bluetooth");
                    BluetoothStat = myRef.child("Users").child(userUID).child("BluetoothStat");
                    Doors = myRef.child("Users").child(userUID).child("Doors");
                    DoorsStat = myRef.child("Users").child(userUID).child("DoorsStat");
                    HeadLights = myRef.child("Users").child(userUID).child("HeadLights");
                    HeadLightsStat = myRef.child("Users").child(userUID).child("HeadLightsStat");
                    AutoLights = myRef.child("Users").child(userUID).child("AutoLights");
                    AutoLightsStat = myRef.child("Users").child(userUID).child("AutoLightsStat");
                    SystemStat = myRef.child("Users").child(userUID).child("SystemStat");
                    KeyLess = myRef.child("Users").child(userUID).child("KeyLess");
                    ApplicationStat = myRef.child("Users").child(userUID).child("ApplicationStat");
                    ScreenMode = myRef.child("Users").child(userUID).child("ScreenMode");
                    InternetStat = myRef.child("Users").child(userUID).child("InternetStat");
                    Application= myRef.child("Users").child(userUID).child("Application");


E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.ramir.carhandcontroller, PID: 14759
              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ramir.carhandcontroller/com.example.ramir.carhandcontroller.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)' on a null object reference
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
                  at android.app.ActivityThread.access$1100(ActivityThread.java:221)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:158)
                  at android.app.ActivityThread.main(ActivityThread.java:7224)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
               Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)' on a null object reference
                  at com.example.ramir.carhandcontroller.MainActivity.onCreate(MainActivity.java:165)
                  at android.app.Activity.performCreate(Activity.java:6876)
                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
                  at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:158) 
                  at android.app.ActivityThread.main(ActivityThread.java:7224) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

1 个答案:

答案 0 :(得分:0)

最后我找到了问题的答案 我的代码问题是我试图引用尚未存在的Firebase链接, 例如

Engine = myRef.child("Users").child(userUID).child("Engine");

当代码开始检查那些链接的dataChange(userUID)时,还没有创建,并且给出了NULL异常。

我通过将代码移动到另一个活动,并使主要活动仅使用google登录方法登录Firebase来解决所有提到的问题。

在身份验证期间,我将为String分配用户唯一代码,然后在登录的最后阶段,我将使用以下代码检查这是否是我的应用程序第一次运行

if (prefs.getBoolean("firstrun", true)) {

                //Initiating Database values can go in here

                prefs.edit().putBoolean("firstrun", false).commit();

            }

在此部分之后,我使用(Intent)调用另一个活动与puExtra,我发送userUID。