Android / Java,Cloud Firestore .toObject方法不起作用

时间:2017-12-05 16:10:37

标签: android firebase google-cloud-firestore

我开发了一款与Google Firebase Cloud Firestore互动的Android应用。要从Firestore获取数据,我将addOnCompleteListener与DocumentSnapshot.toObject()方法一起使用。但是,方法toObject()似乎无法正常工作,因为它不会将数据从快照传输到对象。

Goal.class

@Entity
public class Goal {

    // private variables
    @PrimaryKey (autoGenerate = true)
    private int id;
    private String remoteId;
    private int goalPos;
    private String goalName;
    private int goalCategory;
    private String goalDescription;
    private int goalColor;
    private int goalFrequency;
    private long goalFrequencyCode;
    private boolean goalRewardType;
    private double goalReward;
    private int activated;
    private boolean isSynced;

    // constructor
    public Goal() {
        remoteId = "";
        goalPos = 0;
        goalName = "";
        goalCategory = 15;
        goalDescription = "";
        goalColor = R.color.cat_Black;
        goalFrequency = 0; // 0=Daily, 1=Weekly, 2=Monthly
        goalFrequencyCode = 1111111111; // 1111111.111 - Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday; first of month, middle of month, last of month
        goalRewardType = false; // false = standard, true = individual
        activated = 1; // 0=No, 1=Yes
        isSynced = false;
    }

    // getter and setter
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getRemoteId() {
        return remoteId;
    }

    public void setRemoteId(String remoteId) {
        this.remoteId = remoteId;
    }

    public int getGoalPos() {
        return goalPos;
    }

    public void setGoalPos(int goalPos) {
        this.goalPos = goalPos;
    }

    public String getGoalName() {
        return goalName;
    }

    public void setGoalName(String goalName) {
        this.goalName = goalName;
    }

    public int getGoalCategory() {
        return goalCategory;
    }

    public void setGoalCategory(int goalCategory) {
        this.goalCategory = goalCategory;
    }

    public String getGoalDescription() {
        return goalDescription;
    }

    public void setGoalDescription(String goalDescription) {
        this.goalDescription = goalDescription;
    }

    public int getGoalColor() {
        return goalColor;
    }

    public void setGoalColor(int goalColor) {
        this.goalColor = goalColor;
    }

    public int getGoalFrequency() {
        return goalFrequency;
    }

    public void setGoalFrequency(int goalFrequency) {
        this.goalFrequency = goalFrequency;
    }

    public long getGoalFrequencyCode() {
        return goalFrequencyCode;
    }

    public void setGoalFrequencyCode(long goalFrequencyCode) {
        this.goalFrequencyCode = goalFrequencyCode;
    }

    public LinkedList<Integer> getGoalFrequencyCodeAsList() {
        LinkedList<Integer> stack = new LinkedList<>();
        long number = goalFrequencyCode;
        while (number > 0) {
            long longTempMod = number % 10;
            int intTempMod = (int) longTempMod;
            stack.push(intTempMod);
            number = number / 10;
        }
        return stack;
    }

    public void setGoalFrequencyCodeFromList(LinkedList<Integer> stack) {
        double number = 0;
        for (int j = 0; j < stack.size(); j++) {
            Log.d(String.valueOf(j), String.valueOf(stack.get(j)));
        }
        if (stack.size() <= 1) {
            goalFrequencyCode = 1111111111;
        } else {
            for (int i = 0; i < stack.size(); i++) {
                Log.d(String.valueOf(stack.get(i)), String.valueOf(number));
                number = number + (stack.get(i) * Math.pow(10, (stack.size() - 1 - i)));
            }
            Log.d("Sent from Goal - number", String.valueOf(number));
            goalFrequencyCode = (long) number;
            Log.d("Sent from Goal - long", String.valueOf(goalFrequencyCode));
        }
    }

    public boolean getGoalRewardType() {
        return goalRewardType;
    }

    public void setGoalRewardType(boolean goalRewardType) {
        this.goalRewardType = goalRewardType;
    }

    public double getGoalReward() {
        return goalReward;
    }

    public void setGoalReward(double goalReward) {
        this.goalReward = goalReward;
    }

    public int getActivated() {
        return activated;
    }

    public void setActivated(int activated) {
        this.activated = activated;
    }

    public boolean getIsSynced() {
        return isSynced;
    }

    public void setIsSynced(boolean isSynced) {
        this.isSynced = isSynced;
    }

    @Override
    public String toString() {
        return "Goal{" +
                "id=" + id +
                ", remoteId='" + remoteId + '\'' +
                ", goalPos=" + goalPos +
                ", goalName='" + goalName + '\'' +
                ", goalCategory=" + goalCategory +
                ", goalDescription='" + goalDescription + '\'' +
                ", goalColor=" + goalColor +
                ", goalFrequency=" + goalFrequency +
                ", goalFrequencyCode=" + goalFrequencyCode +
                ", goalRewardType=" + goalRewardType +
                ", goalReward=" + goalReward +
                ", activated=" + activated +
                ", isSynced=" + isSynced +
                '}';
    }
}

FirebaseService.class

public LiveData<ApiResponse<List<Goal>>> getGoals() {
    final MutableLiveData<ApiResponse<List<Goal>>> list = new MutableLiveData<>();
    if (mAuth.getCurrentUser() != null) {
        userId = mAuth.getCurrentUser().getUid();
        colRefGoals = firestore.collection(userId).document("data").collection("goals");
        colRefGoals
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            List<Goal> goalsList = new ArrayList<Goal>();
                            for (DocumentSnapshot documentSnapshot : task.getResult()) {
                                Log.d("firebaseService", "DocumentSnapshop.getData: " + documentSnapshot.getData());
                                Goal goal = documentSnapshot.toObject(Goal.class);
                                Log.d("firebaseService", "DocumentSnapshot.toObject(Goal.class): " + goal.toString());
                                goalsList.add(goal);
                            }
                            ApiResponse<List<Goal>> apiResponse = new ApiResponse<List<Goal>>(goalsList);
                            list.setValue(apiResponse);
                        }
                    }
                });
    } else {
        Throwable error = new Throwable("No user logged in");
        ApiResponse<List<Goal>> apiResponse = new ApiResponse<List<Goal>>(error);
        list.setValue(apiResponse);
        return list;
    }
    return list;
}

遵循.getData和.toObject之间的调试日志比较:

12-05 19:53:42.663 11470-11470/com.benjaminsommer.dailygoals D/firebaseService: DocumentSnapshop.getData: {goals={goalRewardType=true, remoteId=10L44s0EcvTTzGajzhidgoals, id=2, goalFrequencyCode=1001111111, activated=1, goalColor=-4365347, goalCategory=8, goalDescription=Description Test, goalReward=1, goalPos=1, goalFrequency=2, goalName=Test}} 
12-05 19:53:42.663 11470-11470/com.benjaminsommer.dailygoals D/firebaseService: DocumentSnapshot.toObject(Goal.class): Goal{id=0, remoteId='', goalPos=0, goalName='', goalCategory=15, goalDescription='', goalColor=2131558437, goalFrequency=0, goalFrequencyCode=1111111111, goalRewardType=false, goalReward=0.0, activated=1, isSynced=false}

.toObject不会将数据快照转换为我的类。我已经检查了文档:

  

重要提示:每个自定义类都必须具有公共构造函数   没有争论。此外,该课程必须包含一个公共的getter   每个属性。

我有一个没有args的构造函数和每个属性的公共getter。我用一个空的构造函数尝试了它,但也没有工作。我的吸气剂有什么问题吗?我将它与Room结合使用,也许会出现问题?

非常感谢您的帮助和支持。

谢谢,Ben

0 个答案:

没有答案