¿Cómo recuperar un producto aleatorio único en Node Firebase?
Firebase proporciona estructuras de datos flexibles, lo que le permite almacenar datos de forma jerárquica. En algunos escenarios, es posible que tenga una gran cantidad de registros, pero solo necesita un registro único y aleatorio. Este artículo lo guiará a través de dos enfoques para lograr esto en Node Firebase.
Enfoque clásico: descargar todos los registros
Suponiendo que la estructura de su base de datos se parezca a la siguiente:
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
Para recuperar un producto aleatorio, puede implementar el siguiente código:
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);
Al recorrer todos los productos, puede crear una lista y generar un índice aleatorio dentro de esa lista, que representa el producto seleccionado.
Optimizado Enfoque: evitar la descarga completa de registros
Para minimizar la recuperación de datos, puede reestructurar su base de datos como siguiente:
Firebase-root | --- products | | | --- productIdOne | | | | | --- //details | | | --- productIdTwo | | | --- //details | --- productIds | --- productIdOne: true | --- productIdTwo: true | --- //And so on
Aquí, crea un nodo separado llamado productIds, que contiene solo los ID de sus productos. Para recuperar un producto aleatorio:
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);
Al recuperar primero el ID del producto, luego puede consultar el producto específico, lo que resulta en un proceso de recuperación más eficiente y específico.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3