Issue
i am working on android application and i am trying to read data from the firestore. One of the key contains further object data which i want to read. i was able to read the data for purchases but purchases has further array data with contains products keys. i am unable to read that. i want a simple solution, no class implementation please!
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Map<String, Object> data = (Map<String, Object>) document.getData().get("path");
Set<String> keys = data.keySet();
for (String s : keys) {
if (Objects.equals(s, "purchases")) {
Log.d(TAG, "onComplete: " + data.get(s));
}
}
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
Here purchase is an array and each array element has further data which contains products key . and product is further nested into object. i want to make a llop to read data of products.
Thanks
Solution
I should just go with the data class implementation, pretty easy.
Make a few classes that match the result of the Firebase call:
class Purchases {
public List<Purchase> purchases;
public Purchases(List<Purchase> purchases) {
this.purchases = purchases;
}
}
class Purchase {
public String id;
public Double price;
public List<Product> products;
public Purchase(String id, Double price, List<Product> products) {
this.id = id;
this.price = price;
this.products = products;
}
}
class Product {
public String addedOn;
// More values
public Product(String addedOn) {
this.addedOn = addedOn;
// Add those values to the constructor too
}
}
And then you should be able to use toObject()
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
document.toObject(Purchases::class.java) // to Object here
}
}
}
}
So you just need to make a few classes that will simply hold the data. You could read more here.
Answered By - Stefan de Kraker
Answer Checked By - Pedro (JavaFixing Volunteer)