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

在Android中从Firebase Realtime Database获取Ingridients到ArrayList

从Firebase Realtime Database提取Ingridients并存入ArrayList的实现方案

没问题,我来帮你搞定这个需求!结合你给出的数据库结构,下面是具体的实现步骤和代码示例:

1. 确认Firebase依赖配置(若未完成)

首先确保你的Android项目已经正确集成Firebase Realtime Database,要是还没配置,先在对应的build.gradle文件中添加依赖:

// 项目级build.gradle的buildscript区块
buildscript {
    dependencies {
        classpath 'com.google.gms:google-services:4.3.15'
    }
}

// 应用级build.gradle的dependencies区块
dependencies {
    implementation 'com.google.firebase:firebase-database:20.2.2'
}

// 应用级build.gradle底部添加插件
apply plugin: 'com.google.gms.google-services'

2. 核心代码实现(Java版本)

在你的Activity或Fragment中,通过Firebase的数据库引用查询数据,并将Ingridients字段的内容存入ArrayList:

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import android.util.Log;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

// 在你的Activity/Fragment类内
public class YourActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

        // 获取Firebase数据库实例和Receptes节点引用
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference receptesRef = database.getReference("Receptes");

        // 初始化存放所有食材的ArrayList
        ArrayList<String> allIngredients = new ArrayList<>();

        // 添加实时监听(若只需单次查询,改用addListenerForSingleValueEvent)
        receptesRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                allIngredients.clear(); // 每次数据更新时清空旧数据,避免重复添加

                // 遍历Receptes下的每一条食谱数据
                for (DataSnapshot receptSnapshot : dataSnapshot.getChildren()) {
                    // 获取当前食谱的Ingridients子节点
                    DataSnapshot ingredientsSnapshot = receptSnapshot.child("Ingridients");

                    // 遍历Ingridients数组里的每个食材
                    for (DataSnapshot ingredientSnapshot : ingredientsSnapshot.getChildren()) {
                        String ingredient = ingredientSnapshot.getValue(String.class);
                        if (ingredient != null) {
                            allIngredients.add(ingredient);
                        }
                    }
                }

                // 数据处理完成,这里可以做UI更新等操作(注意要切回主线程)
                runOnUiThread(() -> {
                    // 示例:打印所有食材到Logcat
                    for (String ing : allIngredients) {
                        Log.d("AllIngredients", ing);
                    }
                    // 比如更新RecyclerView的数据源等
                });
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                // 处理查询失败的情况,比如打印错误日志
                Log.w("FirebaseError", "读取数据失败", databaseError.toException());
            }
        });
    }
}

3. Kotlin版本实现(可选)

如果你的项目用Kotlin开发,对应的代码如下:

import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import java.util.ArrayList
import android.util.Log
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class YourActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.your_layout)

        val database = FirebaseDatabase.getInstance()
        val receptesRef = database.getReference("Receptes")

        val allIngredients = ArrayList<String>()

        receptesRef.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(dataSnapshot: com.google.firebase.database.DataSnapshot) {
                allIngredients.clear()

                for (receptSnapshot in dataSnapshot.children) {
                    val ingredientsSnapshot = receptSnapshot.child("Ingridients")
                    for (ingredientSnapshot in ingredientsSnapshot.children) {
                        val ingredient = ingredientSnapshot.getValue(String::class.java)
                        ingredient?.let { allIngredients.add(it) }
                    }
                }

                // 主线程更新UI
                runOnUiThread {
                    allIngredients.forEach { Log.d("AllIngredients", it) }
                }
            }

            override fun onCancelled(databaseError: com.google.firebase.database.DatabaseError) {
                Log.w("FirebaseError", "读取数据失败", databaseError.toException())
            }
        })
    }
}

关键注意事项

  • 单次查询vs实时监听:如果不需要实时同步数据,把addValueEventListener换成addListenerForSingleValueEvent即可,这样只会获取一次数据。
  • 字段名匹配:代码中child("Ingridients")的拼写要和数据库中完全一致(注意是大写I开头,末尾带s),否则会读取不到数据。
  • 数据库规则:开发阶段可以暂时设置规则为{ "rules": { ".read": true, ".write": true } }方便调试,但上线前一定要配置安全的读写规则,避免数据泄露。

内容的提问来源于stack exchange,提问作者Felay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:28:33