Check if value exists in firebase DB
The exists()
method is part of the snapshot
object which is returned by firebase queries. So keep in mind that you won't be able to avoid retrieving the data to verify if it exists or not.
ref.child("users").orderByChild("ID").equalTo("U1EL5623").once("value",snapshot => {
if (snapshot.exists()){
const userData = snapshot.val();
console.log("exists!", userData);
}
});
Observations:
In case you are in a different scenario which you have the exact ref path where the object might be, you wont need to add orderByChild
and equalTo
. In this case, you can fetch the path to the object directly so it wont need any search processing from firebase. Also, if you know one of the properties the object must have you can do as the snippet below and make it retrieve just this property and not the entire object. The result will be a much faster check.
//every user must have an email
firebase.database().ref(`users/${userId}/email`).once("value", snapshot => {
if (snapshot.exists()){
console.log("exists!");
const email = snapshot.val();
}
});
Checking if a particular value exists in the Firebase database
To check the existence of a user, please use the below code:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userNameRef = rootRef.child("Users").child("Nick123");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.exists()) {
//create new user
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
userNameRef.addListenerForSingleValueEvent(eventListener);
You can also use a Query to achieve the same thing like this:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("Users").orderByChild("userName").equalTo("Nick123");
query.addValueEventListener(/* ... */);
This is another approach which is looping through the entire Users
node but is not just using a direct reference to a single user. This option is more likely to be used when you are using as a unique identifier beteeen users the uid
instead of the user name (as you do right now). So if your database structure might looks similar to this:
Firebase-root
|
--- Users
|
--- uid
|
--- userName: "Test User"
|
--- emailAddress: "user@email.com"
The second solution is the recommended one.
There is also another solution which involves you to create another node named userNames
, in which you can hold only the unique user names. Please also find below the corresponding security rules:
"Users": {
"$uid": {
".write": "auth !== null && auth.uid === $uid",
".read": "auth !== null && auth.provider === 'password'",
"userName": {
".validate": "
!root.child('userNames').child(newData.val()).exists() ||
root.child('userNames').child(newData.val()).val() == $uid"
}
}
}
But since in this case, your user name is already the name of the node, I recommend you go ahead with the first one.
How to check if value exists in Firebase Realtime Database (Dart/Flutter)?
once() always yields a DataSnapshot object. You have to check if that snapshot contains any data by looking at its value property.
if (snapshot.value == null) {
print("Item doesn't exist in the db");
} else {
print("Item exists in the db");
}
Check if some key value exists in Firebase Database and do some action Android
After a long time, my brain light burned and I came up with a solution.
Create a data class for OrderState
public class OrderState {
public static int ordersCount = 0;
public static boolean state = false;
public static void update(boolean state){
if (state){
ordersCount = ordersCount + 1;
OrderState.state = true;
}else
if (!state && ordersCount > 0){
ordersCount = ordersCount - 1;
if (ordersCount < 1) OrderState.state = false;
}
}
public static void reset(){
ordersCount = 0;
state = false;
}
}
On FirebaseRecyclerAdapter -> onBindViewHolder
//if order not canceled or completed. it will update OrderState,
//ordersCount + 1 and state to true
if (adminOrders.getState().equals(Prevalent.orderStateNew) ||
adminOrders.getState().equals(Prevalent.orderStateApproved) ||
adminOrders.getState().equals(Prevalent.orderStateShipped) ||
adminOrders.getState().equals(Prevalent.orderStateApproved)){
OrderState.update(true);
}
changeUserWithOrderState();
On changing state of order by admin
//if the order is not already cancelled or completed, reduce one order from OrderState as it will be readded automatically upon Recycler refresh.
if (!adminOrders.getState().equals(Prevalent.orderStateCanceled) &&
!adminOrders.getState().equals(Prevalent.orderStateCompleted)) OrderState.update(false);
Al last if the user does not has any order with states New, Approved, and Shipped
OrderState.orderCount = 0;
OrderState.state = false;
and upon updating the database it will set the state to false.
private void changeUserWithOrderState() {
DatabaseReference userWithOrder = FirebaseDatabase.getInstance().getReference()
.child(Prevalent.usersWithOrders)
.child(userPhoneKey);
HashMap<String, Object> map = new HashMap<>();
map.put(Prevalent.orderState, String.valueOf(OrderState.state));
userWithOrder.updateChildren(map).addOnCompleteListener(task -> {
//Changed state based upon OrderState.state value...
});
}
How to check if a value exists in firebase
Try this:
boolean CheckExists =false; //declare and assign default value in global scope
reference.child("Users").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Iterable<DataSnapshot> userChildren = dataSnapshot.getChildren();
for (DataSnapshot user: userChildren) {
User u = user.getValue(User.class); //make a model User with necessary fields
if(u.email.equalsIgnoreCase(Email.getText().toString())){
CheckExists =true;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
function to check if a value exists in firebase database (variable needs to be final or effectively final)
You have two separate problems, the compiler error and a conceptual error. To get your desired result, you need to restructure the code to fix the conceptual error, but you should also try to understand the compiler error in the existing code.
For the compiler error, see the explanation of effectively final variables in anonymous inner classes in this question.
(You didn't provide imports in your example, so I am guessing about the framework you are using in the links I provide below).
For the conceptual error, according to the documentation, the purpose of the addListenerForSingleValueEvent
method is to register a listener that will be notified (asynchronously, i.e., in another thread) if the value referred to by the DatabaseReference
changes. Even if your code compiled, registering the listener would return immediately, and the value of your exists
variable would depend on whether the listener happened to update the value of the variable in the very short time before your code reached the return statement.
Instead, you need to check the value directly. For this, I think you need the get
method. This method is also asynchronous, but works differently. It gives you a Task, and you need to wait for the Task
to complete (using the Tasks.await) before retrieving its value.
The code should look something like this:
public boolean esiste(String desc, DatabaseReference meseref){
Task<DataSnapshot> task = meseref.get();
DataSnapshot dataSnapshot = Tasks.await(task);
return snapshot.child(desc).exists();
}
Check If a Particular Value Exists in the FireBase Database Using Python
To conditionally write a value to a path in the database, you can use a transaction.
In your case that's look something like:
def set_initial_value(current_value):
return current_value if current_value else {
'Name' : user.full_name,
'ID' : str(user.id),
'Date' : str(update.message.date.astimezone(pytz.timezone('Asia/Damascus')).strftime("%d-%b-%Y")),
'Time' : str(update.message.date.astimezone(pytz.timezone('Asia/Damascus')).strftime("%H:%M:%S"))
}
ref = db.reference("/Logs")
try:
ref.child(user.name).transaction(set_initial_value);
print('Transaction completed')
except db.TransactionAbortedError:
print('Transaction failed to commit')
How do you check if value exists within Firebase live database using Firebase Functions?
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.test = functions.https.onRequest((request, response) => {
return ExistTest();
function RandCharGen(length){
var result = '';
var characters = 'ABCDEFGHIJKLMNPRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789';
var charactersLength = characters.length;
for ( var i = 0; i < length; i++ ) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
function ExistTest(){
var result = RandCharGen(4);
admin.database().ref(result).once('value', (snapshot) => {
if (snapshot.exists()) {
ExistTest();
}
else{
response.send(result);
return result;
}
});
}
});
For anyone who wants the correct answer or knows a cleaner way of doing so.
Related Topics
Firestore: How to Get Random Documents in a Collection
What Is Difference Between Optional and Decodeifpresent When Using Decodable For Json Parsing
How Does Collisionbitmask Work? Swift/Spritekit
How to Remove the Left and Right Padding of a List in Swiftui
Swift 4 Decodable - Dictionary With Enum as Key
Nsfilemanager Fileexistsatpath:Isdirectory and Swift
Delete Folder With Contents from Firebase Storage
Firebase Getting Data in Order
How Flatmap API Contract Transforms Optional Input to Non Optional Result
How to See Which Version of Swift I'M Using
Swift @Escaping and Completion Handler
Downcasting Optionals in Swift: As? Type, or As! Type
Tabview Resets Navigation Stack When Switching Tabs