Как получить уникальный случайный продукт в Node Firebase?
Firebase предоставляет гибкие структуры данных, позволяющие хранить данные в иерархическом порядке. В некоторых сценариях у вас может быть огромное количество записей, но вам потребуется только одна уникальная и случайная запись. В этой статье вы познакомитесь с двумя подходами к достижению этой цели в Node Firebase.
Классический подход: загрузка всех записей
Предполагаем, что структура вашей базы данных выглядит следующим образом:
Firebase-root | --- products | --- productIdOne | | | --- name: "gjwj" | | | --- category: "hreggrrg" | | | --- location: "vjhiwehifwe" | | | --- price: 44 | | | --- color: "fassaf" | --- productIdTwo | | | --- name: "uygfwh" | | | --- category: "hhhjwwwom" | | | --- location: "pervrr" | | | --- price: 33 | | | --- color: "yrtrr" | --- //And so on
Чтобы получить случайный товар, вы можете реализовать следующий код:
var listView = (ListView) findViewById(R.id.list_view);
var arrayAdapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, randomProductList);
listView.setAdapter(arrayAdapter);
var rootRef = FirebaseDatabase.getInstance().getReference();
var productsRef = rootRef.child("products");
var valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
var productList = new ArrayList();
for(var ds : dataSnapshot.getChildren()) {
var name = ds.child("name").getValue(String.class);
productList.add(name);
}
var productListSize = productList.size();
var randomProductList = new ArrayList();
randomProductList.add(new Random().nextInt(productListSize));
arrayAdapter.notifyDatasetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors!
}
};
productsRef.addListenerForSingleValueEvent(valueEventListener);
Проходя по всем продуктам, вы можете создать список и сгенерировать в этом списке случайный индекс, который представляет выбранный продукт.
Оптимизировано Подход: избежать полной загрузки записей
Чтобы свести к минимуму получение данных, вы можете реструктурировать вашу базу данных следующим образом:
Firebase-root | --- products | | | --- productIdOne | | | | | --- //details | | | --- productIdTwo | | | --- //details | --- productIds | --- productIdOne: true | --- productIdTwo: true | --- //And so on
Здесь вы создаете отдельный узел с именем ProductIds, который содержит только идентификаторы ваших продуктов. Чтобы получить случайный продукт:
var rootRef = FirebaseDatabase.getInstance().getReference();
var productIdsRef = rootRef.child("productIds");
var valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
var productIdsList = new ArrayList();
for(var ds : dataSnapshot.getChildren()) {
var productId = ds.getKey();
productIdsList.add(productId);
}
var productListSize = productList.size();
var randomProductList = new ArrayList(););
var productIdRef = rootRef.child("products").child(productIdsList.get(new Random().nextInt(int productListSize));
var eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
var name = dataSnapshot.child("name").getValue(String.class);
Log.d("TAG", name);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Error: ", task.getException());
}
};
productIdRef.addListenerForSingleValueEvent(eventListener);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Error: ", task.getException());
}
};
productIdsRef.addListenerForSingleValueEvent(valueEventListener);
Сначала получив идентификатор продукта, вы затем можете запросить конкретный продукт, что приведет к более эффективному и целевому процессу поиска.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3