私はアプリを持っており、これに対してonCreate
のメソッドcheckData()
を実行して、必要な子ノードが存在することを確認します。最初のユーザーでもすべてが機能することを確認する)。 onStart
のupdateUI()
に電話します。これにより、それぞれのノードからデータが取得され、それぞれテキストフィールドが更新されます。 これらのメソッドのいずれかを使用しないコードを追加したところで、ここでエラーが発生しました(このコードを削除してもエラーが発生しても問題は発生しません)。私は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
あなたのユーザークラスとあなたが書いたデータを投稿してください。おそらく、あなたのUserクラスが宣言したものとあなたが書いたものとの間に不一致があるかもしれません。 – Kushan
また、dbのスナップショットを投稿してください。 – Kushan
このポストを後で見る人々への参照として、与えられたノードが存在すると、dataSnapshotを直接使用できます。初めてデータが追加されるときに、dataSnapshotのループがその役割を果たしているようです。 – namsnath