Como recuperar um produto aleatório exclusivo no Node Firebase?
O Firebase fornece estruturas de dados flexíveis, permitindo armazenar dados de maneira hierárquica. Em alguns cenários, você pode ter um grande número de registros, mas precisa apenas de um único registro único e aleatório. Este artigo irá guiá-lo através de duas abordagens para conseguir isso no Node Firebase.
Abordagem clássica: baixando todos os registros
Supondo que a estrutura do seu banco de dados seja semelhante à seguinte:
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 um produto aleatório, você pode implementar o seguinte 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);
Ao iterar por todos os produtos, você pode criar uma lista e gerar um índice aleatório dentro dessa lista, que representa o produto selecionado.
Otimizado Abordagem: evitando download completo de registros
Para minimizar a recuperação de dados, você pode reestruturar seu banco de dados como segue:
Firebase-root | --- products | | | --- productIdOne | | | | | --- //details | | | --- productIdTwo | | | --- //details | --- productIds | --- productIdOne: true | --- productIdTwo: true | --- //And so on
Aqui, você cria um nó separado chamado productIds, que contém apenas os IDs dos seus produtos. Para recuperar um produto aleatório:
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);
Ao recuperar primeiro o ID do produto, você pode consultar o produto específico, resultando em um processo de recuperação mais eficiente e direcionado.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3