だから、私はFirebaseはそうのように平坦化されたデータベースを構築するための最新の勧告をする考えを続いてきました:取得子供は親ノードからオブジェクト
カテゴリとサブカテゴリがあります子であるサブカテゴリのキーへの参照を持つカテゴリを持つ別々のノード。
次に、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": ""
}
}
}
}
おかげでフランクは、明らかに私はあなたの提案を試す前に、自分のデータベースをリファクタリングする必要がありますが、それはよさそうです。私はユーザーとカテゴリーを自由に混在させることがどういう意味なのかよく分かりませんが、私が今行っている完全なデータベース構造は含まれていないためです。 – DaveSav