You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

修正后的代码

调整逻辑直接查询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();
        }
    }
}

额外注意事项

  1. 实体类匹配:确保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; }
}
  1. 安全规则配置:确保登录用户能访问自己的资产数据,示例规则:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:52:16