在 Node Firebase 中获取唯一的随机产品
要从超过 1000 条记录的节点数据库中检索单个随机产品,请考虑两种方法:经典解决方案和非规范化方法。
经典解决方案
<br>ListView listView = (ListView) findViewById(R.id.list_view);<br>ArrayAdapter arrayAdapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, randomProductList);<br>listView.setAdapter(arrayAdapter);<br>DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); <br>DatabaseReference productsRef = rootRef.child("products"); // 添加了对 .child("products")<br>ValueEventListener valueEventListener = new ValueEventListener() {<pre class="brush:php;toolbar:false">@Override public void onDataChange(DataSnapshot dataSnapshot) { List<String> productList = new ArrayList<>(); for(DataSnapshot ds : dataSnapshot.getChildren()) { String name = ds.child("name").getValue(String.class); productList.add(name); } int productListSize = productList.size(); List<String> randomProductList = new ArrayList<>(); randomProductList.add(new Random().nextInt(productListSize)); //Add the random product to list arrayAdapter.notifyDatasetChanged(); } @Override public void onCancelled(DatabaseError databaseError) { Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors! }
};
productsRef.addListenerForSingleValueEvent(valueEventListener);
pre>
此方法循环遍历所有产品节点,将其名称添加到列表中,然后随机选择一个。
非规范化方法
创建一个单独的“productIds”节点以避免下载大量数据:
<br>Firebase-root<br> |<br> --- products<br> | |<br> | ---productIdOne<br> | | |<br> | | --- //详细信息<br> | |<br> | ---productIdTwo<br> | |<br> | --- //详细信息<br> | <br> --- ProductIds<pre class="brush:php;toolbar:false"> | --- productIdOne: true | --- productIdTwo: true | --- //And so on
<br>DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();<br> DatabaseReference ProductIdsRef = rootRef.child("productIds");<br>ValueEventListener valueEventListener = new ValueEventListener() {<pre class="brush:php;toolbar:false">@Override public void onDataChange(DataSnapshot dataSnapshot) { List<String> productIdsList = new ArrayList<>(); for(DataSnapshot ds : dataSnapshot.getChildren()) { String productId = ds.getKey(); productIdsList.add(productId); } int productListSize = productList.size(); List<String> randomProductList = new ArrayList<>(); DatabaseReference productIdRef = rootRef.child("products").child(productIdsList.get(new Random().nextInt(int productListSize)); ValueEventListener eventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String name = dataSnapshot.child("name").getValue(String.class); Log.d("TAG", name); } @Override public void onCancelled(DatabaseError databaseError) { Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors! } }; productIdRef.addListenerForSingleValueEvent(eventListener); } @Override public void onCancelled(DatabaseError databaseError) { Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors! }
};
productIdsRef.addListenerForSingleValueEvent(valueEventListener);
pre>
此方法查询“productIds”节点以获取随机产品 ID,然后查询“products”节点以获取具体详细信息。
以上是如何在 Node 中从大型 Firebase 数据库中高效选择随机产品?的详细内容。更多信息请关注PHP中文网其他相关文章!