如何在Android中查询Firebase的Releases结构数据?
在Android中查询Firebase Realtime Database的指定结构数据
首先先明确你的数据结构(修正格式以符合JSON规范):
"releases": { "worldwide": [ { "key1": { "movie_id": 100, "release_date": 1524182400000, "description": "Cool movie here" }, "key2": { "movie_id": 101, "release_date": 1525046400000, "description": "Plot is cool" } } ], "europe": [ { "key1": { "movie_id": 100, "release_date": 1516798528489, "description": "Cool movie here" }, "key3": { "movie_id": 102, "release_date": 1525046400000, "description": "Cool plot" } } ] }
下面分场景给你讲Android中的查询方法,同时提供Kotlin和Java示例:
1. 基础准备工作
首先要初始化Firebase Database引用,还要定义对应电影数据的实体类,方便数据序列化:
定义Movie实体类
Kotlin
data class Movie( val movie_id: Int? = null, val release_date: Long? = null, val description: String? = null )
Java
public class Movie { private Integer movie_id; private Long release_date; private String description; // Firebase序列化必须要有无参构造函数 public Movie() {} // Getter和Setter方法 public Integer getMovie_id() { return movie_id; } public void setMovie_id(Integer movie_id) { this.movie_id = movie_id; } public Long getRelease_date() { return release_date; } public void setRelease_date(Long release_date) { this.release_date = release_date; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
获取Releases节点引用
Kotlin
val database = FirebaseDatabase.getInstance() val releasesRef = database.getReference("releases")
Java
FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference releasesRef = database.getReference("releases");
2. 查询指定地区的所有电影
比如要查询worldwide下的全部电影数据:
Kotlin
releasesRef.child("worldwide").addValueEventListener(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { // 你的结构里worldwide是数组,里面仅包含一个对象,先取出这个对象 val movieContainer = snapshot.children.firstOrNull() ?: return // 遍历对象里的所有电影节点 for (movieSnapshot in movieContainer.children) { val movie = movieSnapshot.getValue(Movie::class.java) movie?.let { // 处理拿到的电影数据,比如打印日志 Log.d("FirebaseQuery", "ID: ${it.movie_id}, 描述: ${it.description}") } } } override fun onCancelled(error: DatabaseError) { Log.e("FirebaseQuery", "查询失败", error.toException()) } })
Java
releasesRef.child("worldwide").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // 获取数组中的第一个对象(你的结构里数组只有一个元素) DataSnapshot movieContainer = snapshot.getChildren().iterator().next(); // 遍历所有电影节点 for (DataSnapshot movieSnapshot : movieContainer.getChildren()) { Movie movie = movieSnapshot.getValue(Movie.class); if (movie != null) { Log.d("FirebaseQuery", "ID: " + movie.getMovie_id() + ", 描述: " + movie.getDescription()); } } } @Override public void onCancelled(@NonNull DatabaseError error) { Log.e("FirebaseQuery", "查询失败", error.toException()); } });
3. 条件查询(按movie_id筛选)
如果要查询某个地区下movie_id为100的电影:
Kotlin
releasesRef.child("worldwide").children.firstOrNull()?.let { container -> container.orderByChild("movie_id").equalTo(100.0) .addValueEventListener(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { for (movieSnapshot in snapshot.children) { val movie = movieSnapshot.getValue(Movie::class.java) // 处理找到的目标电影 } } override fun onCancelled(error: DatabaseError) { Log.e("FirebaseQuery", "条件查询失败", error.toException()) } }) }
Java
DataSnapshot movieContainer = releasesRef.child("worldwide").getChildren().iterator().next(); movieContainer.orderByChild("movie_id").equalTo(100.0) .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { for (DataSnapshot movieSnapshot : snapshot.getChildren()) { Movie movie = movieSnapshot.getValue(Movie.class); if (movie != null) { // 处理找到的电影 } } } @Override public void onCancelled(@NonNull DatabaseError error) { Log.e("FirebaseQuery", "条件查询失败", error.toException()); } });
小建议:优化数据结构
你当前的结构里worldwide和europe用数组包裹对象,其实这个数组是多余的,直接将它们设为对象会更便于查询,优化后的结构如下:
"releases": { "worldwide": { "key1": { "movie_id": 100, "release_date": 1524182400000, "description": "Cool movie here" }, "key2": { "movie_id": 101, "release_date": 1525046400000, "description": "Plot is cool" } }, "europe": { "key1": { "movie_id": 100, "release_date": 1516798528489, "description": "Cool movie here" }, "key3": { "movie_id": 102, "release_date": 1525046400000, "description": "Cool plot" } } }
优化后,查询时无需额外取数组里的第一个元素,直接对releasesRef.child("worldwide")进行遍历或条件查询,代码会更简洁。
内容的提问来源于stack exchange,提问作者user9132502
相关产品推荐
相关产品推荐

