입니다. 따라서 앱이있어서 에있는 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
사용자 클래스와 작성한 데이터를 게시하십시오. 아마도 User 클래스가 선언 한 것과 사용자가 작성한 것 사이에 불일치가있을 것입니다. – Kushan
또한 db의 스냅 샷을 게시하십시오. – Kushan
나중에이 게시물을 보는 사람들에게 주어진 노드가 나타나면 dataSnapshot을 직접 사용할 수 있습니다. 데이터가 처음 추가 될 때 dataSnapshot을 통한 루프가 작업을 수행하는 것 같습니다. – namsnath