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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:44:01