数据无法从firebase中检索

时间:2017-02-22 12:09:04

标签: android firebase firebase-realtime-database

我正在尝试从Firebase检索数据,但在将valueEventListener应用于数据后显示空数据,ShoppingList类包含的值userShopping抛出空

Firebase数据快照:

click to view the image

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;
    }
}

日志:

click to view the image

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;
    }
}

3 个答案:

答案 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";
    }
}