How to retrieve the data in nested object? Im able to get all the data in document but fail to retrieve the nested object, Just want to retrieve all the data under usr_card-card1,card2 into array or map
userid = FirebaseAuth.getInstance().getCurrentUser().getUid();
fStore = FirebaseFirestore.getInstance();
DocumentReference documentReference = fStore.collection("users").document(userid);
documentReference.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
#Override
public void onComplete(#NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
String usr_name = "usr_name",usr_email="usr_email";
String name = document.getString(usr_name);
String email = document.getString(usr_email);
Log.d(TAG, "DocumentSnapshot data: " + document.getData());
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
Map type fields in Firestore documents show up as Map type objects in Java.
Map<String, Object> usr_card = (Map<String, Object) document.get("usr_card");
You can work with the returned Map exactly as you would any other Map.
Related
I'm creating an app in the android studio IDE and I want to display the inserted data in a text box
but the problem is I don't know how to retrieve the data that I inserted in the driver field. The driver field is a map, Is there a way to retrieve the data insert in the driver field? This is my firebase fire store look like, I want to get the tricycle number data.
can anyone give me example on how to retrieve a data in a map collection field?
Following the documentation on getting data from Firestore, you can get a DataSnapshot object of the data at that location. Then using DocumentSnapshot#get() to get the value of an individual field.
This can be done using:
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference driverDocRef = db.collection("Driver Locations")
.document(driverId);
driverDocRef.get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
#Override
public void onComplete(#NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Log.d(TAG, "Driver #" + driverId + "'s Tricycle Number is " + document.get("driver.tricyclenumber", String.class));
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
To make this into a function that you can reuse elsewhere, you can make use of Task#onSuccessTask() to chain tasks together.
One such implementation of this would be:
public Task<String> getDriverTricycleNumber(String driverId) {
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference driverDocRef = db.collection("Driver Locations")
.document(driverId);
return driverDocRef.get()
.onSuccessTask(new SuccessContinuation<DocumentSnapshot, String>() {
#NonNull
#Override
public Task<String> then(DocumentSnapshot document) {
if (!document.exists()) {
throw new DriverNotFoundException(); // <-- a custom exception of your choosing
}
return document.get("driver.tricyclenumber", String.class);
}
});
}
// to use:
getDriverTricycleNumber("someDriverId")
.addOnCompleteListener(new OnCompleteListener<Number>() {
#Override
public void onComplete(#NonNull Task<Number> task) {
if (task.isSuccessful()) {
String tricycleNumber = task.getResult();
Log.d(TAG, "Driver #" + driverId + "'s Tricycle Number is " + tricycleNumber);
} else {
Log.d(TAG, "Couldn't get tricycle number", task.getException());
}
}
});
Note: Optionally, you can simplify the above code using modern arrow notation and chaining:
public Task<String> getDriverTricycleNumber(String driverId) {
return FirebaseFirestore.getInstance()
.collection("Driver Locations")
.document(driverId)
.get()
.onSuccessTask(document -> {
if (!document.exists()) {
throw new DriverNotFoundException(); // <-- a custom exception of your choosing
}
return document.get("driver.tricyclenumber", String.class);
});
}
getDriverTricycleNumber("someDriverId")
.addOnSuccessListener(tricycleNumber -> {
Log.d(TAG, "Driver #" + driverId + "'s Tricycle Number is " + tricycleNumber);
})
.addOnFailureListener(exception -> {
Log.d(TAG, "Couldn't get tricycle number", exception);
});
If it's a map, then just use completely-standard dot notation:
const myFirstname = data.driver.firstname;
const myLastname = data.driver.lastname
etc etc etc
I have a Firebase Firestore database in which I have to get all the field's inside a document by document id.
How to get the all the field values (inside Green Box) by document id (Red box)
If you want to get that specific document you can try this
DocumentReference docRef = db.collection("projects").document("YOURDOCIDHERE");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
#Override
public void onComplete(#NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Log.d(TAG, "DocumentSnapshot data: " + document.getData());
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
If you want get all documents by key order then you can try making a query like this.
docRef.orderByKey()
Check firebase documention for more info.
Im trying to make a code for uploading item/stock to firestore. what i want is if the Item is already registered in firestore, then recalculate the quantity. But if the item is not registered yet in firestore, system add new document to firestore.
I already make a code like below, if i try to add item that is already registered it succeed on recalculating the quantity but the problem is when i want to add new item ( that is not registered in database) it doesnt work. Can somebody fix my code.
final FirebaseFirestore db = FirebaseFirestore.getInstance();
merk = etMerk.getText().toString().trim();
type = etType.getText().toString().trim();
typemerk = type + " - " + merk;
qty = etQty.getText().toString().trim();
price = etPrice.getText().toString().trim();
date = datetime.getText().toString();
final Map<String, Object> stock = new HashMap<>();
stock.put("date", date);
stock.put("type", typemerk);
stock.put("qty", qty);
stock.put("price", price);
stock.put("merk", merk);
final FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
final CollectionReference documentReference = rootRef.collection("watchlist");
Query query = documentReference.whereEqualTo("type", typemerk);
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
#Override
public void onComplete(#NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
Log.d(Tag.ITEM, document.getId() + "=>" + document.getData());
String id = document.getString("id");
String oldqty = document.getString("qty");
Integer i = Integer.parseInt(oldqty) + Integer.parseInt(qty);
String newQty = String.valueOf(i);
Map<Object, String> map = new HashMap<>();
map.put("qty", newQty);
rootRef.collection("watchlist").document(document.getId()).set(map, SetOptions.merge());
Toast.makeText(AddItemActivity.this, "Berhasil menambah stok", Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.GONE);
}
} else {
Log.d(Tag.ITEM, "not register in DB", task.getException());
Toast.makeText(AddItemActivity.this, "new item to database", Toast.LENGTH_SHORT).show();
documentReference
.add(stock)
.addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
#Override
public void onSuccess(DocumentReference documentReference) {
Toast.makeText(AddItemActivity.this, "Berhasil Memasukkan Barang ke Stok", Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.GONE);
etMerk.setText("");
etType.setText("");
etQty.setText("");
etPrice.setText("");
etMerk.setFocusable(true);
}
})
.addOnFailureListener(new OnFailureListener() {
#Override
public void onFailure(#NonNull Exception e) {
Toast.makeText(AddItemActivity.this, "Gagal Memasukkan stok, silahkan coba lagi.", Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.GONE);
}
});
}
}
});
}
You should check to make sure that your query returned successfully and that it's not empty. It can return an empty result if the query was processed but there was no matching result.
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("myCollection")
.whereEqualTo("myQuery", myQueryValue)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
#Override
public void onComplete(#NonNull Task<QuerySnapshot> task) {
boolean documentExists;
if(task.isSuccessful()){
Log.d("QueryResult", "Is query result empty: " + task.getResult().isEmpty());
documentExists = !task.getResult().isEmpty();
}else{
Log.e("QueryResult", "Error getting documents.", task.getException());
documentExists = false;
}
if(documentExists){
Log.d("QueryResult", "The document exists");
// Do whatever you need to do with the document
}else{
Log.d("QueryResult", "The document doesn't exist or there was an error retrieving it");
// Create the document or whatever else you need to do
}
}
});
I'm trying to get every field in one document in firestore. Field's key are random numbers and values are same with keys.How can i do that with document?
DocumentReference docRef = db.collection("cities").document("SF");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
#Override
public void onComplete(#NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Log.d(TAG, "DocumentSnapshot data: " + document.getData());
// get every field in document.getData();
}
}
}
});
document.getData() returns a Map<String, Object> with all the fields from the document, as you can see from the API documentation. You iterate all the fields in the same way that you iterate all the entries in a Map.
for (Map.Entry<String, Object> entry : map.entrySet()) {
// entry.getKey() will contain the name of the field with each iteration.
}
I am new to Android and Firestore, I was able to retrieve data from Firestore without any problems.
But, I'm not sure how to use the reference.
Here's the data structure for person;
{ name=abc, gender=male, title=software engineer, company=abc, useraccount=com.google.firebase.firestore.DocumentReference#4878aac
}
So I get the useraccount-reference like this;
DocumentReference userAccountRef = doc.getDocumentReference("useraccount");
My question is how to retrieve information from user account by using this userAccountRef? I don't see any API to get a document by reference.
To get a document from a DocumentReference you call get() on it. From the Firebase documentation:
userAccountRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
#Override
public void onComplete(#NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document != null && document.exists()) {
Log.d(TAG, "DocumentSnapshot data: " + document.getData());
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});