Android Studio对接Cloud Firestore获取数据失败:数据库结构问题求助
问题解决:Firestore数据结构适配与代码调整
问题根源
你的代码逻辑与实际Firestore数据结构不匹配:
- 代码期望从
users/{userId}文档读取assetDocumentId字段,再获取对应单篇资产文档,但实际assets子集合下是多个独立的资产文档(如Cash、Car),而非单篇包含所有资产的文档。 - 原代码仅处理单个资产数据,无法满足饼图、列表展示多资产的需求。
适配需求的Firestore数据结构
无需修改集合框架,保持现有结构即可:
- 根集合:
users- 文档:用户ID(即
currentUser.getUid())- 子集合:
assets- 文档:可使用自动生成ID或自定义命名(如Cash、Car)
- 字段:
name(字符串):资产名称(如"Cash")value(数字):资产金额(如10000)
- 字段:
- 文档:可使用自动生成ID或自定义命名(如Cash、Car)
- 子集合:
- 文档:用户ID(即
修正后的代码
调整逻辑直接查询assets子集合下的所有文档,不再依赖assetDocumentId字段:
package com.example.fyp_obv1; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.github.mikephil.charting.charts.PieChart; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieEntry; import com.github.mikephil.charting.utils.ColorTemplate; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.QueryDocumentSnapshot; import java.util.ArrayList; public class AssetsActivity extends AppCompatActivity { private PieChart pieChart2; private ListView listView2; private ArrayList<String> liabilitiesList; private FirebaseFirestore db; private FirebaseUser currentUser; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.assets_pg); pieChart2 = findViewById(R.id.pieChart); listView2 = findViewById(R.id.assetsListView); db = FirebaseFirestore.getInstance(); FirebaseAuth auth = FirebaseAuth.getInstance(); currentUser = auth.getCurrentUser(); if (currentUser != null) { String userId = currentUser.getUid(); // 直接查询当前用户的所有资产文档 db.collection("users") .document(userId) .collection("assets") .get() .addOnSuccessListener(queryDocumentSnapshots -> { if (!queryDocumentSnapshots.isEmpty()) { ArrayList<PieEntry> pieEntries = new ArrayList<>(); liabilitiesList = new ArrayList<>(); // 遍历所有资产数据 for (QueryDocumentSnapshot document : queryDocumentSnapshots) { Assets asset = document.toObject(Assets.class); pieEntries.add(new PieEntry((float) asset.getValue(), asset.getName())); liabilitiesList.add(asset.getName() + ": RM " + asset.getValue()); } // 配置饼图 PieDataSet dataSet = new PieDataSet(pieEntries, "Assets"); dataSet.setColors(ColorTemplate.COLORFUL_COLORS); PieData data = new PieData(dataSet); pieChart2.setData(data); pieChart2.getDescription().setEnabled(false); pieChart2.invalidate(); // 配置列表 ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, liabilitiesList); listView2.setAdapter(adapter); } else { Toast.makeText(AssetsActivity.this, "未找到任何资产数据!", Toast.LENGTH_LONG).show(); } }) .addOnFailureListener(e -> { Toast.makeText(AssetsActivity.this, "数据获取失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); }); } else { Toast.makeText(AssetsActivity.this, "用户未登录!", Toast.LENGTH_LONG).show(); } } }
额外注意事项
- 实体类匹配:确保
Assets类的字段名与Firestore字段完全一致(大小写敏感),示例实体类:
public class Assets { private String name; private double value; // Firestore序列化必须的无参构造函数 public Assets() {} public Assets(String name, double value) { this.name = name; this.value = value; } // Getter和Setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public double getValue() { return value; } public void setValue(double value) { this.value = value; } }
- 安全规则配置:确保登录用户能访问自己的资产数据,示例规则:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId}/{document=**} { allow read, write: if request.auth != null && request.auth.uid == userId; } } }
内容的提问来源于stack exchange,提问作者Harry Kwan
相关产品推荐
相关产品推荐

