在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
相关产品推荐
相关产品推荐

