2016-12-18 30 views
1

だから、私はFirebaseはそうのように平坦化されたデータベースを構築するための最新の勧告をする考えを続いてきました:取得子供は親ノードからオブジェクト

enter image description here

カテゴリとサブカテゴリがあります子であるサブカテゴリのキーへの参照を持つカテゴリを持つ別々のノード。

次に、Categoriesキーに基づいてクエリを実行し、その子サブカテゴリを返すことができるようにしたいと考えました。

私は私が見つけることができる唯一の例である。この(時代遅れ)たとえば、上の私のコードをベース - https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html

var commentsRef = new Firebase("https://awesome.firebaseio-demo.com/comments"); 
var linkRef = new Firebase("https://awesome.firebaseio-demo.com/links"); 
var linkCommentsRef = linkRef.child(LINK_ID).child("comments"); 
linkCommentsRef.on("child_added", function(snap) { 
    commentsRef.child(snap.key()).once("value", function() { 
    // Render the comment on the link page. 
)); 
}); 

からとするための最良の推測の交換にAndroid上で実行するためにそれを変換してみましたもはや、上記の例から存在していない方法:

final DatabaseReference subCategoriesRef = FirebaseDatabase.getInstance().getReference("users").child(user.getUid()).child("SubCategories"); 
    DatabaseReference categoriesRef = FirebaseDatabase.getInstance().getReference("users").child(user.getUid()).child("Categories"); 
    Query categoriesSubCategoriesRef = categoriesRef.child(EXTRA_CATEGORY_KEY).child("SubCategories"); 
    categoriesSubCategoriesRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      subCategoriesRef.child(dataSnapshot.getKey()); 
      subCategoriesRef.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 

        //Log.v("item", dataSnapshot.child("SubCategories").child("SubCategoryName").getValue().toString()); 
       } 
       @Override 
       public void onCancelled(DatabaseError databaseError) { 
       } 
      }); 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 

それ作品のようなものが、それだけではなく上のサブカテゴリのすべてを返しますその上

DataSnapshot { key = SubCategories, value = {-KZ8aQOhk1r7tj5gjM97={ 
Description=, isChecked=false, ID=103, Published=1, SubCategoryName=Name1, hasExtra=false, Deleted=0, CategoryID=8}, 
-KZ8aQP98TujvnjAERXF={Description=, isChecked=false, ID=40, Published=1, SubCategoryName=Name2, hasExtra=false, Deleted=0, CategoryID=2},... 

...そして:私はそれがその後、JSONオブジェクトとして返しますEXTRA_CATEGORY_KEY、と指定したカテゴリーの子であるES。

まずは:私のデータ構造は正しいのですか?それとも非難された勧告に従っていますか?そして第二に、私のクエリの問題は何ですか?

EDIT:これは、データベースの現在の(正しくない)完全構造です。各ユーザーはプライベートで、他のユーザーとデータを共有することはできません。

{ 
    "users": { 
    "Uc6PJMfq5VZpT2V7EHMmmGPk0Zv2": { 
    "Categories": { 
    "-KZ8aQPi5QXrFv_RrKIh": { 
     "CategoryName": "", 
     "Constant": "", 
     "Deleted": 0, 
     "Description": "", 
     "ID": 1, 
     "Published": 1, 
     "Sequence": 1, 
     "SubCategories": { 
     "-KZ8aQPHbCTtveAfR_D8": true, 
     "-KZ8aQPHbCTtveAfR_D9": true 
     } 
    } 
    }, 
    "SubCategories": { 
    "-KZ8aQPHbCTtveAfR_D8": { 
     "CategoryID": 1, 
     "Deleted": 0, 
     "Description": "", 
     "ID": 1, 
     "Published": 1, 
     "SubCategoryName": "", 
     "hasExtra": false, 
     "isChecked": false 
    }, 
    "-KZ8aQPHbCTtveAfR_D9": { 
     "CategoryID": 1, 
     "Deleted": 0, 
     "Description": "", 
     "ID": 21, 
     "Published": 1, 
     "SubCategoryName": "", 
     "hasExtra": false, 
     "isChecked": false 
    } 
    }, 
    "journal": { 
    "-KYzQOrMrEenlXobzG3d": { 
     "entry": "Test entry", 
     "entryDate": { 
     "date": 14, 
     "day": 3, 
     "hours": 22, 
     "minutes": 22, 
     "month": 11, 
     "seconds": 5, 
     "time": 1481754125034, 
     "timezoneOffset": 0, 
     "year": 116 
     }, 
     "id": "", 
     "source": "journal" 
    } 
    }, 
    "userDetails": { 
    "email": "", 
    "username": "" 
    } 
}, 
"anotheruniqueuser": { 
    "Categories": { 
    }, 
    "SubCategories": {   
    }, 
    "journal": { 
    }, 
    "userDetails": { 
    "email": "", 
    "username": "" 
    } 
} 
    } 
} 

答えて

0

サンプルでは、​​JavaでChildEventListener.onChildAddedに変換child_addedイベントにリッスンをコピーしたスニペット。

スニペットは次のようになります。

DatabaseReference categoriesRef = FirebaseDatabase.getInstance().getReference("Categories"); 
DatabaseReference subCategoriesRef = categoriesRef.child(user.getUid()).child("SubCategories"); 
DatabaseReference categoriesRef = categoriesRef.child(user.getUid()).child("Categories"); 
DatabaseReference categoriesSubCategoriesRef = categoriesRef.child(EXTRA_CATEGORY_KEY).child("SubCategories"); 

categoriesSubCategoriesRef.addChildEventListener(new ChildEventListener() {  
    @Override 
    public void onChildAdded(DataSnapshot keySnapshot, String previousChildKey) { 
     subCategoriesRef.child(keySnapshot.getKey()); 
     subCategoriesRef.addSingleValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Log.v("item", dataSnapshot.child("SubCategories").child("SubCategoryName").getValue().toString()); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
      } 
     }); 
    }); 

    @Override 
    public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) { 
     // ... 
    } 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) { 
     // ... 
    } 

    @Override 
    public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) { 
     // ... 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw dataError.toException(); 
    } 
}); 

いくつかのコメント:

  • もはや存在していないスニペットの唯一の方法は、FirebaseDatabase.getInstance().getReference("links")に変換new Firebase("https://awesome.firebaseio-demo.com/links")、です。
  • あなたのコードで自由にユーザーとカテゴリを混在させているようです。せいぜいそれは混乱しますが、間違っている可能性が高いです。私は上記のコードでミックスを理解するために最善を尽くしましたが、おそらく失敗しました。
  • 各ユーザーの下には、複数の種類のデータがあります。 Firebaseのドキュメントのベストプラクティスに従うには、カテゴリのメタデータ(名前、説明、数値IDなど)をそれらの階層構造から分離します。

    Categories 
        category1 
         name: ... 
         description: ... 
        category2 
         name: ... 
         description: ... 
        category3 
         name: ... 
         description: ... 
    Parents 
        category2: category1 
        category3: category1 
    Children 
        category1 
         category2: true 
         category3: true 
    
+0

おかげでフランクは、明らかに私はあなたの提案を試す前に、自分のデータベースをリファクタリングする必要がありますが、それはよさそうです。私はユーザーとカテゴリーを自由に混在させることがどういう意味なのかよく分かりませんが、私が今行っている完全なデータベース構造は含まれていないためです。 – DaveSav

関連する問題