2017-12-28 19 views
0

私はアプリを持っており、これに対してonCreateのメソッドcheckData()を実行して、必要な子ノードが存在することを確認します。最初のユーザーでもすべてが機能することを確認する)。 onStartupdateUI()に電話します。これにより、それぞれのノードからデータが取得され、それぞれテキストフィールドが更新されます。 これらのメソッドのいずれかを使用しないコードを追加したところで、ここでエラーが発生しました(このコードを削除してもエラーが発生しても問題は発生しません)。私はupdateUI()呼び出しを削除した場合ファイヤーベースのデータがプッシュされた直後にヌルポインタの結果が返される

、ノードが適切に作成され、すべてがプログラムの後続の実行で動作しますが、checkData()updateUI()への即時呼び出しが私のデータが存在しないことを私に伝え、ノードは次のように作成されていませんよく私は何がここで間違っているのか分からず、私は迷っています。

public void checkData() 
    { 
     //Checks if the "users" table exists in the database, and populates it with the current user if it doesn't 
     // mDatabase.addListenerForSingleValueEvent(this); 
     mDatabase.addListenerForSingleValueEvent(new ValueEventListener() 
     { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) 
      { 
       if (!dataSnapshot.hasChild("users")) 
       { 
        Calendar cal = Calendar.getInstance(); 
        User user = new User(mUser.getUid(), mUser.getDisplayName(), mUser.getEmail(), "", "Chennai", cal); 
        mDatabase.child("users").child(mUser.getUid()).setValue(user); 
        mUsers = mDatabase.child("users"); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) 
      { 

      } 
     }); 

     //Checks if the current user exists in the "users" table, and adds it if it doesn't 
     mUsers.addListenerForSingleValueEvent(new ValueEventListener() 
     { 
      @Override 
      public void onDataChange(DataSnapshot snapshot) 
      { 
       //Log.e("Data Change", snapshot.getValue().toString()); 
       if (!snapshot.hasChild(mUser.getUid())) 
       { 
        Calendar cal = Calendar.getInstance(); 
        User user = new User(mUser.getUid(), mUser.getDisplayName(), mUser.getEmail(), "", "Chennai", cal); 
        mUsers.child(mUser.getUid()).setValue(user); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) 
      { 

      } 
     }); 
    } 


public void updateUI() 
{ 
    Log.e("Update UI", "Called"); 

    eText_passName = findViewById(R.id.eText_passName); 
    eText_passName.setText(mUser.getDisplayName()); 
    eText_date = findViewById(R.id.eText_Date); 
    eText_time = findViewById(R.id.eText_Time); 

    //Gets DateTime String and sets it in the fields 
    mCurrentUser = mUsers.child(mUser.getUid()); 
    mCurrentUser.addListenerForSingleValueEvent(new ValueEventListener() 
    { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) 
     { 
      User u = dataSnapshot.getValue(User.class); 


      String dt = u.getDt(); 
      String dtArr[] = dt.split(" "); 

      eText_date.setText(dtArr[0]); 
      eText_time.setText(dtArr[1]); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) 
     { 

     } 
    }); 

} 

エラー:

12-29 00:54:30.720 26411-26411/com.namsnath.cabplanner E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.namsnath.cabplanner, PID: 26411 
                     java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.namsnath.cabplanner.User.getDt()' on a null object reference 
                      at com.namsnath.cabplanner.MainActivity$3.onDataChange(MainActivity.java:152) 
                      at com.google.firebase.database.zzp.onDataChange(Unknown Source) 
                      at com.google.android.gms.internal.zzegf.zza(Unknown Source) 
                      at com.google.android.gms.internal.zzeia.zzbyc(Unknown Source) 
                      at com.google.android.gms.internal.zzeig.run(Unknown Source) 
                      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:6123) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 

エラーがのupdateUIでu.getDtの呼び出しは()() データの書き込みがどこか中断されたが、私はどこに見つけることができないようです。ログには青色から何も出ていない。

EDIT: データが呼び出される前にDBの更新が遅いインターネット接続が遅いためですか? これがそうならば、Firebaseはローカルコピーを保存していませんか?これはアクセスされていませんか?

EDIT 2:

public class User 
{ 
    String uid, username, email, group, destination; 
    //CustomCal c; 
    String dt; 

    User() 
    {} 

    User(String uid, String username, String email, String group, String destination, Calendar cal) 
    { 
     this.uid = uid; 
     this.username = username; 
     this.email = email; 
     this.group = group; 
     this.destination = destination; 

     SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy KK:mm"); 
     dt = null; 
     try 
     { 
      dt = format.format(cal.getTime()); 
     } 
     catch (Exception e) 
     { 

     } 

     /*int year = cal.get(Calendar.YEAR); 
     int day = cal.get(Calendar.DATE); 
     int month = cal.get(Calendar.MONTH);*/ 
    } 
} 

I書き込みデータがこの形式である:

cabplanner 
    users 
    userUID 
     Data from user class 
+0

あなたのユーザークラスとあなたが書いたデータを投稿してください。おそらく、あなたのUserクラスが宣言したものとあなたが書いたものとの間に不一致があるかもしれません。 – Kushan

+0

また、dbのスナップショットを投稿してください。 – Kushan

+0

このポストを後で見る人々への参照として、与えられたノードが存在すると、dataSnapshotを直接使用できます。初めてデータが追加されるときに、dataSnapshotのループがその役割を果たしているようです。 – namsnath

答えて

1

datasnapshot.getValueは、おそらく複数の結果を返すことができます。試してみてください:

for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
    User u = snapshot.getValue(User.class); 
    ... 
} 
+0

彼は絞り込まれた子ノードにリスナーを付けましたが、それは問題ではないと思います。ほとんどがUser.classへの型キャストを失敗させる不一致があります – Kushan

+0

私が不明な場合は申し訳ありません。 1つの結果しか存在しない場合でも、1つの結果の_リストが含まれます。 – Yuliwee

+0

スナップショットには複数の子が含まれている可能性がありますが、すべての子にマップするクラスにマッピングしています。正しく実行されると、ノード全体が1人のユーザーにマップされます...私は、推測できる限り、マッピングを正しく行っていません。 – Kushan

関連する問題