Detect when all firebase actions are ended [duplicate] - android

This question already has answers here:
Tasks.await not working for FirebaseStorage
(1 answer)
Upload Multiple images and wait for completion before returning, android and firebase
(2 answers)
Closed 2 months ago.
I compare my device database with another one on Firebase. I do all in a loop.
for (int i = 0; i < dataInfo.size(); i++) {
MESSAGE_REFERENCE.child("MyTable_" + myIndex).addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
if (!Objects.equals(dataSnapshot.child("_user_id").getValue(), row.get(1).toString())){
dataSnapshot.child("_user_id").getRef().setValue(row.get(1).toString()).addOnCompleteListener(t -> {
modifications = modifications + 1;
}
if (!Objects.equals(dataSnapshot.child("_location").getValue(), row.get(2).toString())) {
dataSnapshot.child("_location").getRef().setValue(row.get(2).toString()).addOnCompleteListener(t -> {
modifications = modifications + 1;
}
}
});
}
}
I want to post the total of modifications done but the loop is ending before all checks and modifications are done on firebase and allways return for modification a null value.
How can I wait to post result for modifications till all modifications are finally done?

Related

How to only read data from database when the document is added or deleted [duplicate]

This question already has answers here:
How to skip initial data and trigger only new updates in Firestore Firebase?
(4 answers)
Closed 2 years ago.
i have a problem with my code. I want only to listen when the document is added or deleted. The code is working nearly good. Now when the doc is added - toast appear. That works fine. But when i look at the read counter in my database - it increasing so quickly, like the function is 100% time reading all the data from database - not only for changes, like i want. I need to listen only for the changes in collection. Is it a way to do this in android?
I have a webapp and there my javascript code is working fine, read data only when the change appear.
Below my code:
public void listenToDocument() {
// [START listen_document]
myDatabase.collection("markery").addSnapshotListener(new EventListener<QuerySnapshot>()
{
#Override
public void onEvent(#Nullable QuerySnapshot snapshots,
#Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w(TAG, "listen:error", e);
return;
}
for (DocumentChange documentChange : snapshots.getDocumentChanges()) {
switch (documentChange.getType()) {
case ADDED:
String popup_data = documentChange.getDocument().getData().get("popup_data").toString();
GeoPoint geop = (GeoPoint) documentChange.getDocument().getData().get("geop");
Context context = getApplicationContext();
Toast toast = Toast.makeText(context, popup_data, Toast.LENGTH_LONG);
toast.show();
double lng = geop.getLongitude();
double lat = geop.getLatitude();
symbolLayerIconFeatureList.add(Feature.fromGeometry(
Point.fromLngLat(lng, lat)));
break;
case MODIFIED:
break;
case REMOVED:
break;
}
}
}
});
// [END listen_document]
}
When you add a listener to a query (or a collection reference, which is just a query for all documents in the collection), it will read all of the documents and deliver them all to your listener for the first invocation. There is no way to add a listener for only new and changed documents after some point in time.
If you want only new changes, you should add some sort of timestamp field that gets updates with each change, and filter your query using that timestamp, so that only newly modified documents will be delivered to the listener. For example:
myDatabase
.collection("markery")
.whereGreaterThan("timestamp", new Date())
.addSnapshotListener(...)
It will be up to you to make sure that timestamp is updated to the current time along with every update to every document in that collection.

How to get data from fields, not entire document. Firestore [duplicate]

This question already has answers here:
How to access a specific field from Cloud FireStore Firebase in Swift
(5 answers)
Closed 3 years ago.
I am trying to get data from fields on my firebase firestore, but not the whole document.
Fields that i want
Here is my code that get the whole document.
db.collection("Reminder").get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
#Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
if (!queryDocumentSnapshots.isEmpty()) {
List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();
for (DocumentSnapshot d : list) {
dbReminder p = d.toObject(dbReminder.class);
p.setId(d.getId());
remtasklist.add(p);
}
adapter.notifyDataSetChanged();
}
}
});
Thanks in advance.
Edit: I updated with the collection pic.
Collection
You can get specific fields from the documentSnapshot.
String location = documentSnapshot.getString("inLocation");
String time = documentSnapshot.getString("time");//assuming time here is string
String title = documentSnapshot.getString("title");

How to apply multiple query in android firebase? [duplicate]

This question already has answers here:
Query based on multiple where clauses in Firebase
(8 answers)
Closed 6 years ago.
This is My Firebase database structure
i want to get data like
category = "cat" and level = "1"
Here is my code
Query query = firebaseReference.orderByChild("category").equalTo("cat1").limitToFirst(20);
query.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
UTILS.Log.e(TAG, "List Of User Count " + dataSnapshot.getChildrenCount());
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
//FCreateUSer modelRegister = dataSnapshot1.getValue(FCreateUSer.class);
UTILS.Log.e(TAG, "User Email :" + dataSnapshot1.child("question").getValue());
}
}
#Override
public void onCancelled(DatabaseError databaseError) {
}
});
it's wrok but how to use two condition in firbase i try two orderByChild but it's give error java.lang.IllegalArgumentException: You can't combine multiple orderBy calls!
Take a look at this video (it's in JavaScript, but it exactly solves your problem): https://youtu.be/sKFLI5FOOHs?t=612
Basically, you need to structure your data for your queries. In OP example Question will have field like category_level: "cat_1". Then you can perform query equalTo("cat_1"). You can leave out both category and level fields if you need it for other queries (but you will need to handle duplication in that case).
If you know that your number of items is small, simplest solution is to just pull all category=cat and filter level=1 items.

android firebase storage retrieve in listview [duplicate]

This question already has answers here:
How to get a list of all files in Cloud Storage in a Firebase app?
(20 answers)
Closed 6 years ago.
Suppose I have 5 audio files in Firebase Storage and I want to retrieve those 5 audio files and display them in a list view. As I click on any of 5 files then they should be downloaded to local phone memory?
Get the list of your 5 songs on your refernece.then add this list to adapter
your_ref.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
songslist= new ArrayList<String>();
Toast.makeText(DataFromFirebase.this, "number of songs are " + dataSnapshot.getChildrenCount(), Toast.LENGTH_LONG).show();
//String value = (String) dataSnapshot.getValue();
sizetemp=dataSnapshot.getChildrenCount();
// Result will be holded Here
for (DataSnapshot dsp : dataSnapshot.getChildren()) {
songslist.add(String.valueOf(dsp.getKey())); //add result into array list
//NOW YOU HAVE ARRAYLIST WHICH HOLD RESULTS
}
#Override
public void onCancelled(DatabaseError firebaseError) {
}
});

Retrieving data in alphabetical order using Firebase in Android Studio [duplicate]

This question already has answers here:
How can I sort an ArrayList of Strings in Java?
(5 answers)
Closed 7 years ago.
This question is a follow up question from a previous post.
Is there anyway to order the results alphabetically? I'm looking for something like Query's orderByValue().
...
protected ArrayList<String> usernames = new ArrayList<>();
Firebase userRef = ref.child("users");
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
usernames.clear(); // Clear list before updating
for (DataSnapshot child : dataSnapshot.getChildren()) {
String username = (String) child.child("username").getValue();
usernames.add(username);
Log.v(TAG, usernames + "");
}
...
I believe you want Collections.sort(usernames) once you've read all of the children from the dataSnapshot.
How can I sort an ArrayList of Strings in Java?

Categories

Resources