我一直在使用Firebase支持的Android应用,这就是我的数据库看起来像
{
"Category" : {
"-KhHnKaR2oS0JKNrAQWr" : {
"CategoryDescription" : "Ne est",
"CategoryName" : "New Test Category",
"CategoryThumbnail" : "/New Test Category/New Test Category-thumb.jpg",
"ThumbnailFileType" : "jpg"
}.......
},
"Images" : {
"-KhHBBI4QloAEBDxcUac" : {
"Category" : "-KhBGZnCQ5xhYVbP0dtd",
"-KhBGZnCQ5xhYVbP0dtd":true,
"CategoryName" : "please",
"FileType" : "jpg",
"FileURL" : "/please/NewAddTest.jpg",
"Name" : "NewAddTest"
},
"-KhI1wWJK8YUApa0Iv9q" : {
"Category" : "-KhHnKaR2oS0JKNrAQWr",
"-KhHnKaR2oS0JKNrAQWr":true,
"CategoryName" : "New Test Category",
"FileType" : "jpg",
"FileURL" : "/New Test Category/Test Mem.jpg",
"Name" : "Test Mem"
}.....
}
}
我可以通过引用密钥'类别'来获取类别。最初我有嵌入Cateogry和图像,
"-Kh8YUXwK0sg3OyoTyAU" : {
"CategoryDescription" : "The legendary evergreen Vadivelu",
"CategoryName" : "Vadivelu",
"CategoryThumbnail" : "/Vadivelu/v2.png",
"Images":{"-KhH5nJjaji2OtOPVeQF" : {
"Category" : "-KhBGZnCQ5xhYVbP0dtd",
"-KhBGZnCQ5xhYVbP0dtd":true,
"FileType" : "jpg",
"FileURL" : "/please/New jpg",
"Name" : "New "
}}
}
虽然效果很好,但在Firebase文档中,我读到保持数据规范化和扁平化更安全,然后我想出了最新的一个。当我尝试查询如下时,它返回所有对象而不是所需的对象,
FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference imageRef = database.getReference("Images");
imageRef.keepSynced(true);
try {
imageRef.child("Images").
orderByChild("Images/Category").equalTo(category.memeCategoryID);
imageRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Returns all objects.
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我也尝试这样做,
imageRef.child(category.CategoryID).equalTo(true);
我打算在这里做的是通过多个单一关系实现并获取标记为类别的所有图像,任何帮助都表示赞赏。我见过这么多线程,官方的Firebase文档确实令人困惑,对我没什么帮助。
答案 0 :(得分:1)
当您致电orderBy...
,equalTo
或其他一种方法时,Firebase会返回一个新的Query
对象。因此,您需要在新变量中捕获该查询:
Query query = imageRef
.child("Images")
.orderByChild("Images/Category")
.equalTo(category.memeCategoryID);
query.addListenerForSingleValueEvent(new ValueEventListener() {