SharedPreferences 在 ValueEventListener 中放入空值
SharedPreferences putting in null values inside ValueEventListener
我正在尝试在我的 Firebase 数据库中找到正确节点的匹配项并将值保存到 SharedPreferences。我使用 ValueEventListener 遍历 Firebase 中的每个节点。但是,当我尝试打印出我刚刚放入 SharedPreferences 的值时,它对所有字段显示 null。
我已经通过检查 commit() 的值来检查是否有异常,但它 returns 是真的。
我也想过可能是线程在稍后完成它的任务,所以我在foreach循环中做了一个runnable并做了同步任务。第一个将值保存到 SharedPreferences,下一个打印值。但这也没有用。
我也认为这可能是上下文不一致的问题,但 'sharedpref' 和 'editor' 都使用相同的 activity 上下文。我在其他活动中访问我想要的数据也没有问题。
这是我遍历我的 Firebase 节点的地方:
final String name = et_name.getText().toString();
DatabaseReference rootref = FirebaseDatabase.getInstance().getReference();
rootref.child("drivers_" + sharedPref.getString("frat_code", null))
.orderByChild("first_name")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
boolean found = false;
iterateFirebase:
for(DataSnapshot node: dataSnapshot.getChildren()) {
Driver driver = node.getValue(Driver.class);
if((driver.getName() != null) && (driver.getName().equals(name))) {
found = true;
editor.putString(driver.getName(), "name");
editor.putString(driver.getOccupants(), "occupants");
editor.putString(driver.getPhone(), "phone");
editor.putString(driver.getMake(), "make");
editor.putBoolean("isLogged", true);
editor.apply();
Log.d(TAG, "Values retrieved from Firebase node: " +
driver.getName() + ", " + driver.getOccupants() +
", " + driver.getMake() + ", " +
driver.getPhone());
Log.i(TAG, "Following user logged in: " +
sharedPref.getString("name", null) + ", " +
sharedPref.getString("occupants", null) +
", " + sharedPref.getString("phone", null) +
", " + sharedPref.getString("make", null) +
", " + sharedPref.getBoolean("isLogged",
false));
Intent intent = new Intent(IfYes.this,
MainActivity.class);
IfYes.this.startActivity(intent);
break iterateFirebase;
}
}
以下是上述日志语句的日志:
Values retrieved from Firebase node: John Smith, 4, Honda Civic, Black,
+11234567890
Following user logged in: null, null, null, null, true
在此先感谢您的帮助。此外,我仍然是初学者,所以如果有任何突出之处,任何代码风格的评论都会受到赞赏。
通知:
editor.putString(driver.getName(), "name");
editor.putString(driver.getOccupants(), "occupants");
editor.putString(driver.getPhone(), "phone");
editor.putString(driver.getMake(), "make");
应该是:
editor.putString("name", driver.getName());
editor.putString("occupants", driver.getOccupants());
editor.putString("phone", driver.getPhone());
editor.putString("make", driver.getMake());
我正在尝试在我的 Firebase 数据库中找到正确节点的匹配项并将值保存到 SharedPreferences。我使用 ValueEventListener 遍历 Firebase 中的每个节点。但是,当我尝试打印出我刚刚放入 SharedPreferences 的值时,它对所有字段显示 null。
我已经通过检查 commit() 的值来检查是否有异常,但它 returns 是真的。
我也想过可能是线程在稍后完成它的任务,所以我在foreach循环中做了一个runnable并做了同步任务。第一个将值保存到 SharedPreferences,下一个打印值。但这也没有用。
我也认为这可能是上下文不一致的问题,但 'sharedpref' 和 'editor' 都使用相同的 activity 上下文。我在其他活动中访问我想要的数据也没有问题。
这是我遍历我的 Firebase 节点的地方:
final String name = et_name.getText().toString();
DatabaseReference rootref = FirebaseDatabase.getInstance().getReference();
rootref.child("drivers_" + sharedPref.getString("frat_code", null))
.orderByChild("first_name")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
boolean found = false;
iterateFirebase:
for(DataSnapshot node: dataSnapshot.getChildren()) {
Driver driver = node.getValue(Driver.class);
if((driver.getName() != null) && (driver.getName().equals(name))) {
found = true;
editor.putString(driver.getName(), "name");
editor.putString(driver.getOccupants(), "occupants");
editor.putString(driver.getPhone(), "phone");
editor.putString(driver.getMake(), "make");
editor.putBoolean("isLogged", true);
editor.apply();
Log.d(TAG, "Values retrieved from Firebase node: " +
driver.getName() + ", " + driver.getOccupants() +
", " + driver.getMake() + ", " +
driver.getPhone());
Log.i(TAG, "Following user logged in: " +
sharedPref.getString("name", null) + ", " +
sharedPref.getString("occupants", null) +
", " + sharedPref.getString("phone", null) +
", " + sharedPref.getString("make", null) +
", " + sharedPref.getBoolean("isLogged",
false));
Intent intent = new Intent(IfYes.this,
MainActivity.class);
IfYes.this.startActivity(intent);
break iterateFirebase;
}
}
以下是上述日志语句的日志:
Values retrieved from Firebase node: John Smith, 4, Honda Civic, Black,
+11234567890
Following user logged in: null, null, null, null, true
在此先感谢您的帮助。此外,我仍然是初学者,所以如果有任何突出之处,任何代码风格的评论都会受到赞赏。
通知:
editor.putString(driver.getName(), "name");
editor.putString(driver.getOccupants(), "occupants");
editor.putString(driver.getPhone(), "phone");
editor.putString(driver.getMake(), "make");
应该是:
editor.putString("name", driver.getName());
editor.putString("occupants", driver.getOccupants());
editor.putString("phone", driver.getPhone());
editor.putString("make", driver.getMake());