我正在尝试从Firebase检索数据,但在将valueEventListener
应用于数据后显示空数据,ShoppingList
类包含的值userShopping抛出空
Firebase数据快照:
ValueEventListener:
mActiveValueListener = mActiveDatabaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ShoppingList shoppingList=dataSnapshot.getValue(ShoppingList.class);
Log.e(LOG_TAG,"is shopping list null:"+String.valueOf(shoppingList==null));
if (shoppingList==null) {
finish();
return;
}
mShoppingList=shoppingList;
mCurrentUserIsOwner= Utils.checkIfOwner(shoppingList,mEncodedEmail);
Log.e(LOG_TAG,"Owner :"+String.valueOf(mCurrentUserIsOwner));
invalidateOptionsMenu();
setTitle(shoppingList.getListName());
mActiveListItemAdapter.setShoppingList(mShoppingList);
HashMap<String,Users> usersShopping=mShoppingList.getUserShopping();
Log.e(LOG_TAG,"User is null: "+String.valueOf(usersShopping==null));
if (usersShopping!=null && usersShopping.size()!=0 && usersShopping.containsKey(mEncodedEmail)){
Log.e(LOG_TAG,"user shopping on");
mShopping=true;
mButtonShopping.setText(getString(R.string.button_stop_shopping));
mButtonShopping.setBackgroundColor(ContextCompat.getColor(ActiveListDetailsActivity.this,R.color.dark_grey));
}
else{
Log.e(LOG_TAG,"user shopping off");
mButtonShopping.setText(getString(R.string.button_start_shopping));
mButtonShopping.setBackgroundColor(ContextCompat.getColor(ActiveListDetailsActivity.this,R.color.primary_dark));
mShopping=false;
}
}
ShoppingList
上课:
public class ShoppingList {
private String listName;
private String owner;
private HashMap<String, Object> timestampLastChanged;
private HashMap<String,Users> userShopping;
/**
* Required public constructor
*/
public ShoppingList() {
}
/**
* Use this constructor to create new ShoppingLists.
* Takes shopping list listName and owner. Set's the last
* changed time to what is stored in ServerValue.TIMESTAMP
*
* @param listName
* @param owner
*
*/
public ShoppingList(String listName, String owner, HashMap<String,Object> timestampLastChanged) {
this.listName = listName;
this.owner = owner;
HashMap<String, Object> timestampLastChangedObj = new HashMap<String, Object>();
timestampLastChangedObj.put(Constants.FIREBASE_PROPERTY_TIMESTAMP, ServerValue.TIMESTAMP);
this.timestampLastChanged = timestampLastChangedObj;
this.userShopping=new HashMap<String,Users>();
}
public String getListName() {
return listName;
}
public String getOwner() {
return owner;
}
public HashMap<String, Object> getTimestampLastChanged() {
return timestampLastChanged;
}
@Exclude
public long getTimestampLastChangedLong() {
return (long) timestampLastChanged.get(Constants.FIREBASE_PROPERTY_TIMESTAMP);
}
public HashMap<String, Users> getUserShopping() {
return userShopping;
}
}
日志:
Users
上课:
public class Users {
private String email;
private String name;
private HashMap<String,Object> timestampJoined;
private boolean hasLoggedInWithPassword;
public Users(){}
public Users(String email,String name,HashMap<String,Object> timestampJoined)
{
this.email=email;
this.name=name;
this.timestampJoined=timestampJoined;
this.hasLoggedInWithPassword=false;
}
public String getName() {
return name;
}
public HashMap<String, Object> getTimestampJoined() {
return timestampJoined;
}
public String getEmail() {
return email;
}
public boolean isHasLoggedInWithPassword() {
return hasLoggedInWithPassword;
}
}
答案 0 :(得分:0)
使用此方法
ShoppingList shoppingList=dataSnapshot.getValue(ShoppingList.class);
Firebase称为空构造函数
public ShoppingList() {
}
因此,您的字段userShopping
为空,使mShoppingList.getUserShopping()
也为空。
如果您希望Firebase分配字段,我认为您需要getter 和 setter。
(如果该数据不在Firebase模型中,您仍然会为空)
答案 1 :(得分:0)
在您的ShoppingList类中进行以下更改
private HashMap<String,Users> usersShopping;
public ShoppingList(String listName, String owner, HashMap<String,Object> timestampLastChanged) {
//...
this.usersShopping=new HashMap<String,Users>();
}
public HashMap<String, Users> getUsersShopping() {
return usersShopping;
}
最好只在课堂内(窗户)
(CTRL + A) + (CTRL + R) [userShopping, usersShopping] -> [Replace All]
答案 2 :(得分:0)
如果要检索所有购物清单,则应循环播放快照,这是您的操作方式:
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot postSnapshot : snapshot.getChildren()) {
//Getting the data from snapshot
ShoppingList ShoppingList = postSnapshot.getValue(Person.class);
//Adding it to a string
String string = "Name:
"+shoppingList.getName()+"\nEmail: "+shoppingList.getEmail()+"\n\n";
}
}