【问题标题】:Android - Get key if data exists (Firebase)Android - 如果数据存在则获取密钥(Firebase)
【发布时间】:2018-04-23 17:43:46
【问题描述】:

在我的一项活动中,我将一些数据插入 Firebase 数据库。在另一个活动中,我想检查插入数据的子项是否存在。如果密钥存在,我想获取根唯一密钥。

问题: 我有这个数据库结构:

我想检查 username 孩子是否存在。如果存在,我想获取根密钥。根唯一键和用户名节点都用红色标记。

我做了什么

  //variable username is the actual username of the current user
    userRef.child(sharedPreferences.getString("school", null)).child("routes").orderByChild("username").equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    String key=ds.getKey();
                    System.out.println("key" + key);
                }
        } 

但我现在不知道如何进入驱动程序节点,以及如何获取根唯一密钥。有什么想法吗?

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:
     if(ds.hasChild("drivers")){
               String key=ds.getKey();    
                } 
    

    你可以这样做:

    userRef.child("routes").orderByChild("username").equalTo("jju").addListenerForSingleValueEvent(...){ //code here }
    

    编辑:

     userRef.child("routes").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                   if(ds.hasChild("driver"){
                    for(DataSnapshot data : ds.getChildren()){
                        if(data.child("username").exists()){
                    String key=ds.getKey();
                    System.out.println("key" + key);
                      }
                    }
                    }
                }
        } 
    

    【讨论】:

    • 感谢您的回答。这给了我所有带有孩子drivers 的钥匙。是否可以检查孩子username是否存在?
    • 你可以做到以上@JDoe
    • 由于某种原因,这不会返回密钥。
    • 然后返回什么?
    • 它什么也不返回。我已经更新了我的帖子。我做错了吗?
    【解决方案2】:

    可以,使用exists() 方法。

    userRef.child("routes").child(routeId).child("drivers").child(userName).addListenerForSingleValueEvent(new 
    ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()){
                    //do something
                } 
        }  
    

    如果您想在所有路由中验证 username 是否存在,假设 routes 节点是您的 Firebase 数据库的直接子节点,请使用以下代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference routesRef = rootRef.child("routes");
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                if(ds.child("drivers").child(userName).exists()) {
                    //do what you want
                }
            }
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    routesRef.addListenerForSingleValueEvent(eventListener);
    

    其中userName 是您要检查其是否存在的用户的名称。

    【讨论】:

    • 我没有 routeId。这就是问题所在。
    • 但是你可以得到它。拥有该 id 的最简单方法是在生成它的那一刻使用 push() 方法获取并存储它,如下所示:String routeId = yourRef.push().getKey(); 拥有该密钥,您可以在 DatabaseReference 中轻松使用它。
    • 但是如果用户名 child 不在那个特定的 routeId 中,而是在另一个 routeId 中怎么办。因为我有很多路线,每条路线都用 routeId 标识。它在routeId 变量中存储了什么 routeId?
    • 我尝试在if-statement 中打印,但它没有打印任何内容。
    • 一个可能的原因是DatabaseReference 不正确。如果你尝试打印Log("TAG", ds.child("drivers").child("username").getRef().toString());是真正的路径?
    【解决方案3】:

    你快到了。您可以传入orderByChild() 的路径以过滤该路径处的属性。所以:

    userRef.child(sharedPreferences.getString("school", null))
           .child("routes").orderByChild("drivers/username").equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() {
    

    现在您的onDataChange 将被调用,其中包含具有所需用户名的所有节点的快照。所以循环它们并打印和你一样:

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                String key=ds.getKey();
                System.out.println("key" + key);
            }
        } 
    

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      相关资源
      最近更新 更多