android–Firebase查询可优化

android–Firebase查询可优化,第1张

概述我有一个Firebase数据库,如下所示:我有一个名为Products的节点 Products | |--------prod1_id | | | |--name : 'prod1' | --state: 'free' | |

我有一个Firebase数据库,如下所示:

我有一个名为Products的节点

 Products    |    |--------prod1_ID    |         |     |         |--name : "prod1"    |          --state: "free"    |             |    |---------prod2_ID              |               |--name : "prod2"               --price: "not_free"

然后我有用户的节点

Users     |     |--------user1_ID     |         |      |         |--name : "user1"     |          --e-mail: "[email protected]"     |               |     |---------user2_ID               |                |--name : "user2"                --e-mail: "[email protected]"

在我的应用程序上,用户可以购买,只有当他/她这样做时,我才创建一个名为PurchasedItems的新节点,我存储用户和产品

Purchased items             |             |--------user1_ID             |         |              |         |--prod1: "any_value"             |          --prod2:  "any_value"             |                      |             |---------user2_ID                       |                        |--prod1: "any_value"

问题在于我对对象的查询,我这样做:

 products_ref= FirebaseDatabase.getInstance().getReference().child("products");

问题是什么?

登录到应用程序的用户,即使他已经购买了产品,也会显示productNotFree布局,因为在产品上我没有提及用户购买此商品的内容,但我的“Trytopurchase”方法有类似之处,我对PurchasedProducts有一个查询,看看用户是否有此产品进行购买.

在我的onClick()方法中,我要检查用户是否已付款

root_ref.child("PurchasedProducts").child(currentuser).addValueEventListener(new ValueEventListener() {    @OverrIDe    public voID onDataChange(DataSnapshot dataSnapshot) {        if(dataSnapshot.hasChild(model.getProduct_ID())){            showToast("He has that product");        }        else{            showToast("Purchasing");            //Purchase for it        }    }    @OverrIDe    public voID onCancelled(DatabaseError databaseError) {    }});

到目前为止,我将这个switch()语句设置为setimageResource,但是从查询到产品

注意:layoutFree例如是一个没有锁定的盒子,而layoutNotFree是同一个盒子但带锁

switch (model.getState()) {        case "free":            holder.card_image.setimageResource(layoutFree);            break;        case "not_free":            holder.card_image.setimageResource(layoutNotFree));            break;        default:            break;    }

现在我已经面临如果用户购买物品,即使他购买了物品,他/她也无法看到layoutFree,即使他/她已付款,他也会看到带锁的布局.

我曾经想过要做什么?

在我使用switch()语句的同一个onBindVIEwHolder上,我可以向Firebase发出另一个查询,询问currentUser是否有此产品,如果他有该产品,我将freeLayout设置为NotFreeLayout.

但我觉得它有点脏,所以我把它放在这里,看看是否还有另一种方法可以提高效率.

我想看到什么?

好吧,如果我是以支付了一个产品状态为“not_free”的用户身份登录的话,我希望看到产品的布局没有锁定项目,如果我支付了一个项目,我创建了一个表buyItems和我做这样的事情:

root_ref.child("PurchasedProducts").child(currentuser).child(productID).setValue("paID");

而且我还希望看到RecyclerVIEw将layoutNotFree更改为layoutFree,是否可以通过任何方式进行更新而不是刷新Activity?刷新活动意味着我必须重新做适配器,创建RecyclerVIEw等…

我希望我已经正确地解释它并且一步一步地避免混淆,如果我在问题上做错了,可以随意编辑它或者向我提问并且我会编辑.

最佳答案在此示例中,所有产品表子项都保存在一个ArrayList中,只有一个请求到Firebase数据库.

根据您的数据库架构.

首先,定义Products.class的ArrayList以保存所有产品详细信息

 ArrayList

其次,在新类中定义Products.class

public class Products {    public String  ID;    public String  name;    public String state;    public Products() {    }    public Products(String name,String state) {        this.name = name;        this.state = state;    }    public String getID() {        return ID;    }    public String getname() {        return name;    }    public String getState() {        return state;    }    public voID setID(String ID) {        this.ID = ID;    }    public voID setname(String name) {        this.name = name;    }    public voID setState(String state) {        this.state = state;    }}

我只添加ID(位置搜索所需),名称,状态
您可以向Products.class添加其他值

第三,使Firebase查询以获取所有产品子项

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Products");        ref.addListenerForSingleValueEvent(                new ValueEventListener() {                    @OverrIDe                    public voID onDataChange(DataSnapshot dataSnapshot) {                        // for loop will be executed for each children                        for(DataSnapshot usersnapshot : dataSnapshot.getChildren()){                            // put snapShot in Products.class ...... only children added                            // in This case Children Will be price,quantity                            Products products = usersnapshot.getValue(Products.class);                            // set ID manually to tha same instance of the class                            products.setID(usersnapshot.getKey());                            // add the Post class to ArrayList                            productsArrayList.add(products);                        }                    }                    @OverrIDe                    public voID onCancelled(DatabaseError databaseError) {                        //handle databaseError                    }                });

现在,产品详细信息保存在productsArrayList中后,您可以在任何地方使用它们.

在ArrayList< Products>中搜索的辅助方法并得到具体的立场

 public int getArrayListProductsposition(String ID){        for(int i = 0; i < productsArrayList.size() ; i++){            // if the passed ID equals some ID in arrayList return arrayList position            if(Objects.equals(productsArrayList.get(i).getID(),ID)){                return i;            }        }        return 0;    }

第四,现在,如果您需要访问特定产品详细信息,请在任何位置更新UI,例如更新UI;

    // pass the ID of the product you want to get details about    // I suppose this ID will probably be retrived from another database tabel    int position = getArrayListProductsposition(ID);    //update your UI TextVIEw quantity for example;    String name = productsArrayList.get(position).getname()    textQuantitiy.setText(name);    // or update you UI ImageVIEw for example;

为了更高效

– 在搜索方法(getArrayListProductsposition)中,将产品ID作为数字保存在数据库中,并在Products.class中进行更改.
String ID to Long ID
因为String-String比较慢于Long-Long比较

– 如果要更改Products表(非静态),请在检索查询后立即使用productsArrayList(您不希望数据变旧)

总结

以上是内存溢出为你收集整理的android – Firebase查询可优化全部内容,希望文章能够帮你解决android – Firebase查询可优化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1139564.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)