我有一个包含产品列表的Firebase数据库,每个产品都有一个购物车元素的子列表。我想只收到包含具有正确用户ID的购物车元素的产品元素。
我正在使用FirebaseUI listadapter。我获得了产品列表的所有元素,但我只想显示包含userID的产品。
我可以从ListAdapter中删除视图吗?或者可以按一些查询排序?
欢迎所有解决问题的想法!
修改
以下是产品类别的一部分。
public class Product implements Serializable{
private boolean active;
private ArrayList<Cart> carts;
private String description;
private String details;
private String ean;
private String id;
private String image;
private String name;
private Float price;
private ArrayList<ProductPack> productpacks;
private int stock;
private int stockavailable;
private Float tax;
private String users;
}
存储在firebase中的部分数据:
products
-KG8O_5iHKWGCBytLtn0
active: true
carts
0
amount: 11
userID: "google:116879660852602200588"
1
amount: 12
userID: "google:116879660852602200589"
description: ""
details: ""
ean: ""
id: "-KG8O_5iHKWGCBytLtn0"
image: "iVBORw0KGgoAAAANSUhEUgAABqsAAAPACAIAAAAt5NQJAAA..."
name: "test"
price: 1
stock: 0
stockavailable: 0
tax: 1
users: ""
-KG9-r5ATr1BokkVzuYt
active: true
carts
0
amount: 11
userID: "google:116879660852602200588"
1
amount: 12
userID: "google:116879660852602200589"
description: ""
details: ""
ean: ""
id: "-KG9-r5ATr1BokkVzuYt"
image: "iVBORw0KGgoAAAANSUhEUgAABqsAAAPACAIAAAAt5NQJAAA..."
name: "test"
price: 1
stock: 0
stockavailable: 0
tax: 0.25
users: ""
答案 0 :(得分:2)
您可以告诉Firebase服务器使用查询过滤数据返回:
Firebase ref = new Firebase("https://yours.firebaseio.com");
Firebase products = ref.child("products");
Query userProducts = products.orderByChild("userId").equalTo(authData.uid);
FirebaseListAdapter<Product> adapter = new FirebaseListAdapter<Product>(
this,
Product.class,
R.layout.product_layout,
userProducts
) { ...
Firebase documentation on queries中记录了这一点,我强烈建议您阅读。在Firebase guide for Android developers花费几个小时,将为您节省大量时间。
虽然这样可行,但您似乎已将类似SQL的结构应用于NoSQL数据库。要退回userProducts
,Firebase服务器必须考虑所有产品。随着产品列表*用户的增长,这将开始花费越来越多的时间。
更优化的读取结构考虑到您通常希望为用户访问产品,因此它会按用户存储产品。
UserProducts
uid1
product1: { ... }
product3: { ... }
product5: { ... }
uid2
product2: { ... }
product4: { ... }
product6: { ... }
现在您可以访问用户的产品:
Firebase ref = new Firebase("https://yours.firebaseio.com");
Firebase products = ref.child("UserProducts");
Firebase userProducts = products.child(authData.uid);
FirebaseListAdapter<Product> adapter = new FirebaseListAdapter<Product>(
this,
Product.class,
R.layout.product_layout,
userProducts
) { ...