查询对象包含userID

时间:2016-04-24 10:32:01

标签: firebase firebase-realtime-database firebaseui

我有一个包含产品列表的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: ""

1 个答案:

答案 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
) { ...