【发布时间】:2020-08-25 10:38:36
【问题描述】:
firebase 实时新手,我正在尝试制作一个 android 宏跟踪应用程序。当我尝试运行下面的代码时,我得到“在类 com.example.pttracker.nutritionEntry 上找不到 -M6v0ZiU6tLuBDlmcuEe 的设置器/字段”
查看有关堆栈溢出的其他问题,有人说这可能是因为 valueEventListener 没有正确定位,但是……不是吗?我正在向下钻取食物条目/营养条目,但我不知道如何钻得更深。没有办法匿名给孩子打电话吗?我尝试调用 childEventListener 而不是 valueEventListener,其他都一样,但我没有再收到该消息,但我仍然无法检索我想要的数据。
我的 JSON 结构:
我的代码:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
Query allEntries = ref.child("Users").child(profile.getProfileKey()).child("Nutrition entries").orderByChild("foodTitle").equalTo(search);
// Query for all entries with a certain child with value equal to something
final ArrayList<nutritionEntry> searchResults = new ArrayList<nutritionEntry>();
// Add listener for Firebase response on said query
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot post : dataSnapshot.getChildren() ){
nutritionEntry ex = post.getValue(nutritionEntry.class);
searchResults.add(ex);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("Error", "Search Cancled");
}
};
allEntries.addListenerForSingleValueEvent(valueEventListener);
if(searchResults.isEmpty()){
TableRow tr = new TableRow(nutritionTracker.this);
TextView tv1 = new TextView(nutritionTracker.this);
tv1.setText("No Results");
}else{
for(final nutritionEntry e : searchResults) {
//code to display the entries
}
非常感谢任何帮助和解释。
编辑:
感谢您迄今为止的帮助。 Per Hasan 在下面的回答我更新了 onDataChanged 中的 for 循环,以便我获得儿童帖子的价值而不是数据快照,这是一个问题。我还更新了代码以转到正确的 UID,然后是营养条目,这也会导致问题。我不再收到相同的消息,但我仍然一无所获。当我进入调试器时,不会调用 onDataChange,因此 resultsList 是空的。 onCancled 从来没有被称为更新代码,这里是暴露的 JSON 的屏幕截图,以及我的 NutritionEntry 类。它有默认构造函数、所有参数的构造函数、所有 getter 和 setter,并且所有字段都与 firebase 中的内容匹配:
public class nutritionEntry {
public String date;
public String foodTitle;
public int calories;
public int protein;
public int totalCarb;
public int fiber;
public int sugar;
public int totalFat;
public int trans;
public int saturated;
public int unsaturated;
public String submittedBy;
public nutritionEntry(String date,String foodTitle, int calories, int protein, int totalCarb, int fiber, int sugar, int totalFat, int trans, int saturated, int unsaturated, String submitter) {
this.date = date;
this.foodTitle = foodTitle;
this.calories = calories;
this.protein = protein;
this.totalCarb = totalCarb;
this.fiber = fiber;
this.sugar = sugar;
this.totalFat = totalFat;
this.trans = trans;
this.saturated = saturated;
this.unsaturated = unsaturated;
this.submittedBy = submitter;
}
public nutritionEntry() {}
public String getDate() {
return date;
}
public String getFoodTitle() {
return foodTitle;
}
public int getCalories() {
return calories;
}
public int getProtein() {
return protein;
}
public int getTotalCarb() {
return totalCarb;
}
public int getFiber() {
return fiber;
}
public int getSugar() {
return sugar;
}
public int getTotalFat() {
return totalFat;
}
public int getTrans() {
return trans;
}
public int getSaturated() {
return saturated;
}
public int getUnsaturated() {
return unsaturated;
}
public String getSubmittedBy() {
return submittedBy;
}
public void setDate(String date) {
this.date = date;
}
public void setFoodTitle(String foodTitle) {
this.foodTitle = foodTitle;
}
public void setCalories(int calories) {
this.calories = calories;
}
public void setProtein(int protein) {
this.protein = protein;
}
public void setTotalCarb(int totalCarb) {
this.totalCarb = totalCarb;
}
public void setFiber(int fiber) {
this.fiber = fiber;
}
public void setSugar(int sugar) {
this.sugar = sugar;
}
public void setTotalFat(int totalFat) {
this.totalFat = totalFat;
}
public void setTrans(int trans) {
this.trans = trans;
}
public void setSaturated(int saturated) {
this.saturated = saturated;
}
public void setUnsaturated(int unsaturated) {
this.unsaturated = unsaturated;
}
public void setSubmittedBy(String submittedBy) {
this.submittedBy = submittedBy;
}
}
第二次编辑:
现在我的数据库规则是读取:true,写入:true,所以我有权限。
最终编辑:
在使用 Hasan 对以下各种问题进行了多次故障排除之后,最后一个难题是我的变量和我的 getter/setter 都在我的 NutritionEntry 类中被声明为 public。将变量从公共访问更改为默认访问,以便我最终可以从 Firebase 检索条目。
【问题讨论】:
-
您预计会发生什么不同,为什么?
-
显示所有内容的屏幕截图。
-
@HasanBouTaam 添加了暴露的 JSON
标签: java android firebase firebase-realtime-database