2017-12-28 24 views
0

입니다. 따라서 앱이있어서 에있는 checkData() 메소드를 실행하여 필요한 자식 노드가 있는지 확인하고 필요하지 않으면 생성하십시오. 모든 사용자가 첫 번째 사용자에 대해서도 작동하는지 확인). onStart에서 updateUI()으로 전화합니다. 그러면 해당 노드에서 데이터를 검색하고 몇 가지 텍스트 필드를 각각 업데이트합니다. 이러한 방법 중 하나를 사용하지 않는 코드를 추가 한 후에 갑자기 오류가 발생하기 시작했습니다. 오류가 제거 된 후에도 오류가 지속됩니다. 나는 updateUI() 호출을 제거하면Null Pointer가 발생하면 즉시 Firebase 데이터가 푸시되었지만 검색 결과가

, 노드가 제대로 생성되고 모든 프로그램의 후속 실행에서 작동하지만, 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에 대한 호출은()() 데이터 기록이 어딘가에 중단됩니다하지만 난 곳을 찾을 수없는 것입니다. 로그에는 파란색 중 아무것도 표시되지 않습니다.

편집 : 느린 인터넷 연결로 인해 데이터를 호출하기 전에 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

불분명하다면 미안합니다. 하나의 결과 만 존재하는 경우에도 하나의 result_ _list가 포함됩니다. – Yuliwee

+0

스냅 샷에는 여러 개의 자식이 포함될 수 있지만 모든 자식에게 매핑되어야하는 클래스에 매핑됩니다. 정확히 완료되면 전체 노드가 한 사용자에게 매핑됩니다 ... 그는 정확하게 추측 할 수있는 한 매핑을 올바르게 수행하지 않았습니다. – Kushan