How to create user and upload data on Firebase in one single transaction
I am making a web application which creates a user on Firebase using email and password firebase.auth().createUserUsingEmailAndPassowrd()
After the account is created, I immediately upload some data based on the forms values on the firebase database.
All works well, but sometimes, In worst case scenarios, the user is created but due to network issues the data is not uploaded. And the app is already redirected to a place where it needs that data and the whole app fails.
How can I make it certain that the user account is created only if the data I am trying to upload on database gets updated too.
Summary : Make sure that some data is uploaded along with user creation or the user doesn't get created at all.
android firebase react-native firebase-realtime-database firebase-authentication
add a comment |
I am making a web application which creates a user on Firebase using email and password firebase.auth().createUserUsingEmailAndPassowrd()
After the account is created, I immediately upload some data based on the forms values on the firebase database.
All works well, but sometimes, In worst case scenarios, the user is created but due to network issues the data is not uploaded. And the app is already redirected to a place where it needs that data and the whole app fails.
How can I make it certain that the user account is created only if the data I am trying to upload on database gets updated too.
Summary : Make sure that some data is uploaded along with user creation or the user doesn't get created at all.
android firebase react-native firebase-realtime-database firebase-authentication
add a comment |
I am making a web application which creates a user on Firebase using email and password firebase.auth().createUserUsingEmailAndPassowrd()
After the account is created, I immediately upload some data based on the forms values on the firebase database.
All works well, but sometimes, In worst case scenarios, the user is created but due to network issues the data is not uploaded. And the app is already redirected to a place where it needs that data and the whole app fails.
How can I make it certain that the user account is created only if the data I am trying to upload on database gets updated too.
Summary : Make sure that some data is uploaded along with user creation or the user doesn't get created at all.
android firebase react-native firebase-realtime-database firebase-authentication
I am making a web application which creates a user on Firebase using email and password firebase.auth().createUserUsingEmailAndPassowrd()
After the account is created, I immediately upload some data based on the forms values on the firebase database.
All works well, but sometimes, In worst case scenarios, the user is created but due to network issues the data is not uploaded. And the app is already redirected to a place where it needs that data and the whole app fails.
How can I make it certain that the user account is created only if the data I am trying to upload on database gets updated too.
Summary : Make sure that some data is uploaded along with user creation or the user doesn't get created at all.
android firebase react-native firebase-realtime-database firebase-authentication
android firebase react-native firebase-realtime-database firebase-authentication
asked Mar 26 '17 at 11:24
Prakhar SharmaPrakhar Sharma
5017
5017
add a comment |
add a comment |
4 Answers
4
active
oldest
votes
Because you're so afraid of worst case scenario (which is absolutely normal), here is one way to do it: Consider you have these fields: email, password, and address. The address field is the one you need to store in your database (with user uid, of course).
First you try to register the user, and like Faizy said, you use onCompleteListener
like this
mAuth.createUserWithEmailAndPassword(email, password)
.onCompleteListener(... {
... onComplete (... task) {
if (task.isSuccessful()) {
doInsertTheData();
}
...
When task is successful, then you want to insert the data into database, which doInsertTheData()
is created for
private void doInsertTheData() {
// I believe you familiar with Firebase database inserting method, so I skip the long part
FirebaseDatabase...setValue(address, new CompletionListener() {
... onComplete(FirebaseError firebaseError, ...) {
if (firebaseError == null) {
// if your code reach here, its a happy ending
} else {
// if it reach here, then you can remove the signed in user
// and tell the user that their registration is failed and should try again
FirebaseAuth.getInstance().getCurrentUser().delete();
}
And there you go, as long as the database saving process failed, the user credential will be deleted
Note: I actually have another method in mind when I type this, but it's too complicated and I think this one is more easy to understand (I haven't try/use this though)
1
Good work! This is what I'd call a more resilient client. But you'd still have inconsistency if the client app crashes between the completion of the creation of the user and it writing to the database. To further reduce chances of that, I'd move this code into Cloud Functions trigger of the user creation: firebase.google.com/docs/functions/auth-events
– Frank van Puffelen
May 18 '17 at 23:28
@FrankvanPuffelen How does the cloud function trigger have access to the data needed to populate user record? ("address, ...")
– cdock
May 23 '17 at 20:51
add a comment |
firebaser here
There are no cross-feature transactions in Firebase at the moment. The common approach is to:
- reduce the risk of cross-feature problems by carefully ordering your code
- increase the resilience of your code against cross-feature failures
This means you decide which one if more important: that each existing user has a database node or that each database node points to an existing user. You seem to want to answer "both", but as said: that's not possible, you'll have to pick. In most scenarios I've seen developers will pick option 1: every Firebase Authentication user must have a node in the database.
In that case, you'll want to run the code that registers a user in the database before actually registering the user with Firebase Authentication. And since the user only gets their UID once they do register with Auth, you'll need some two-stepped process here. All quite nasty code that is bound to have problems. Which is why you'll see that most developers with an app in production care a lot less about this approach than you think.
Instead they rely on regular clean-up of their database. They run an administrative process every day or so that scans the database for users without a corresponding Firebase Authentication registration. This handles all kinds of edge cases with a fairly simple process, even edge cases not related to registration. You might even call this "eventual consistency": eventually the data in the database will match the registered users.
Final shout-out on your original question: you can drastically reduce the chance of a cross-feature failure by running the register-and-write-to-database code in a Cloud Function for Firebase. Using the Admin SDK in a Cloud Function makes this all nice and tidy. But while the chance of failures reduces a lot, it can still fail. So if you care about the cleanliness of your data, you'll still need the clean-up process.
Does anybody know if cross-feature transactions are going to be supported in the future?
– Yulian
Aug 9 '18 at 13:31
While it's hard to say what will happen in the future, nobody is actively working on this at the moment.
– Frank van Puffelen
Aug 9 '18 at 14:39
Okay, thanks for helping me out.
– Yulian
Aug 9 '18 at 19:20
add a comment |
You can do it in your OnComplete method of createUserUsingEmailAndPassowrd().
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
//Create your user in DB here
}
}
});
is it possible that the user gets created and immediately i loose the connection (extreme paranoid) and the onComplete method fails. So i am left with the created user only. and not the data inside the db.
– Prakhar Sharma
Mar 26 '17 at 12:05
add a comment |
If you need user to have certain data to use app, then might have to always check.. when they sign in:
firebase.auth().onAuthStateChanged(user => {
if (user) {
// ... access ref to userData field(s) you care about..
someUserFieldRef.once('value').then(snap => {
if (! snap.exists()) {
// redirect to setup page to add missing data..
}
})
}
})
If they can use other parts of app, then you can defer check to when specific user data is necessary, get currentUser
, then check for data..
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f43028090%2fhow-to-create-user-and-upload-data-on-firebase-in-one-single-transaction%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
Because you're so afraid of worst case scenario (which is absolutely normal), here is one way to do it: Consider you have these fields: email, password, and address. The address field is the one you need to store in your database (with user uid, of course).
First you try to register the user, and like Faizy said, you use onCompleteListener
like this
mAuth.createUserWithEmailAndPassword(email, password)
.onCompleteListener(... {
... onComplete (... task) {
if (task.isSuccessful()) {
doInsertTheData();
}
...
When task is successful, then you want to insert the data into database, which doInsertTheData()
is created for
private void doInsertTheData() {
// I believe you familiar with Firebase database inserting method, so I skip the long part
FirebaseDatabase...setValue(address, new CompletionListener() {
... onComplete(FirebaseError firebaseError, ...) {
if (firebaseError == null) {
// if your code reach here, its a happy ending
} else {
// if it reach here, then you can remove the signed in user
// and tell the user that their registration is failed and should try again
FirebaseAuth.getInstance().getCurrentUser().delete();
}
And there you go, as long as the database saving process failed, the user credential will be deleted
Note: I actually have another method in mind when I type this, but it's too complicated and I think this one is more easy to understand (I haven't try/use this though)
1
Good work! This is what I'd call a more resilient client. But you'd still have inconsistency if the client app crashes between the completion of the creation of the user and it writing to the database. To further reduce chances of that, I'd move this code into Cloud Functions trigger of the user creation: firebase.google.com/docs/functions/auth-events
– Frank van Puffelen
May 18 '17 at 23:28
@FrankvanPuffelen How does the cloud function trigger have access to the data needed to populate user record? ("address, ...")
– cdock
May 23 '17 at 20:51
add a comment |
Because you're so afraid of worst case scenario (which is absolutely normal), here is one way to do it: Consider you have these fields: email, password, and address. The address field is the one you need to store in your database (with user uid, of course).
First you try to register the user, and like Faizy said, you use onCompleteListener
like this
mAuth.createUserWithEmailAndPassword(email, password)
.onCompleteListener(... {
... onComplete (... task) {
if (task.isSuccessful()) {
doInsertTheData();
}
...
When task is successful, then you want to insert the data into database, which doInsertTheData()
is created for
private void doInsertTheData() {
// I believe you familiar with Firebase database inserting method, so I skip the long part
FirebaseDatabase...setValue(address, new CompletionListener() {
... onComplete(FirebaseError firebaseError, ...) {
if (firebaseError == null) {
// if your code reach here, its a happy ending
} else {
// if it reach here, then you can remove the signed in user
// and tell the user that their registration is failed and should try again
FirebaseAuth.getInstance().getCurrentUser().delete();
}
And there you go, as long as the database saving process failed, the user credential will be deleted
Note: I actually have another method in mind when I type this, but it's too complicated and I think this one is more easy to understand (I haven't try/use this though)
1
Good work! This is what I'd call a more resilient client. But you'd still have inconsistency if the client app crashes between the completion of the creation of the user and it writing to the database. To further reduce chances of that, I'd move this code into Cloud Functions trigger of the user creation: firebase.google.com/docs/functions/auth-events
– Frank van Puffelen
May 18 '17 at 23:28
@FrankvanPuffelen How does the cloud function trigger have access to the data needed to populate user record? ("address, ...")
– cdock
May 23 '17 at 20:51
add a comment |
Because you're so afraid of worst case scenario (which is absolutely normal), here is one way to do it: Consider you have these fields: email, password, and address. The address field is the one you need to store in your database (with user uid, of course).
First you try to register the user, and like Faizy said, you use onCompleteListener
like this
mAuth.createUserWithEmailAndPassword(email, password)
.onCompleteListener(... {
... onComplete (... task) {
if (task.isSuccessful()) {
doInsertTheData();
}
...
When task is successful, then you want to insert the data into database, which doInsertTheData()
is created for
private void doInsertTheData() {
// I believe you familiar with Firebase database inserting method, so I skip the long part
FirebaseDatabase...setValue(address, new CompletionListener() {
... onComplete(FirebaseError firebaseError, ...) {
if (firebaseError == null) {
// if your code reach here, its a happy ending
} else {
// if it reach here, then you can remove the signed in user
// and tell the user that their registration is failed and should try again
FirebaseAuth.getInstance().getCurrentUser().delete();
}
And there you go, as long as the database saving process failed, the user credential will be deleted
Note: I actually have another method in mind when I type this, but it's too complicated and I think this one is more easy to understand (I haven't try/use this though)
Because you're so afraid of worst case scenario (which is absolutely normal), here is one way to do it: Consider you have these fields: email, password, and address. The address field is the one you need to store in your database (with user uid, of course).
First you try to register the user, and like Faizy said, you use onCompleteListener
like this
mAuth.createUserWithEmailAndPassword(email, password)
.onCompleteListener(... {
... onComplete (... task) {
if (task.isSuccessful()) {
doInsertTheData();
}
...
When task is successful, then you want to insert the data into database, which doInsertTheData()
is created for
private void doInsertTheData() {
// I believe you familiar with Firebase database inserting method, so I skip the long part
FirebaseDatabase...setValue(address, new CompletionListener() {
... onComplete(FirebaseError firebaseError, ...) {
if (firebaseError == null) {
// if your code reach here, its a happy ending
} else {
// if it reach here, then you can remove the signed in user
// and tell the user that their registration is failed and should try again
FirebaseAuth.getInstance().getCurrentUser().delete();
}
And there you go, as long as the database saving process failed, the user credential will be deleted
Note: I actually have another method in mind when I type this, but it's too complicated and I think this one is more easy to understand (I haven't try/use this though)
edited May 23 '17 at 11:54
Community♦
11
11
answered Mar 26 '17 at 14:21
koceengkoceeng
1,88321133
1,88321133
1
Good work! This is what I'd call a more resilient client. But you'd still have inconsistency if the client app crashes between the completion of the creation of the user and it writing to the database. To further reduce chances of that, I'd move this code into Cloud Functions trigger of the user creation: firebase.google.com/docs/functions/auth-events
– Frank van Puffelen
May 18 '17 at 23:28
@FrankvanPuffelen How does the cloud function trigger have access to the data needed to populate user record? ("address, ...")
– cdock
May 23 '17 at 20:51
add a comment |
1
Good work! This is what I'd call a more resilient client. But you'd still have inconsistency if the client app crashes between the completion of the creation of the user and it writing to the database. To further reduce chances of that, I'd move this code into Cloud Functions trigger of the user creation: firebase.google.com/docs/functions/auth-events
– Frank van Puffelen
May 18 '17 at 23:28
@FrankvanPuffelen How does the cloud function trigger have access to the data needed to populate user record? ("address, ...")
– cdock
May 23 '17 at 20:51
1
1
Good work! This is what I'd call a more resilient client. But you'd still have inconsistency if the client app crashes between the completion of the creation of the user and it writing to the database. To further reduce chances of that, I'd move this code into Cloud Functions trigger of the user creation: firebase.google.com/docs/functions/auth-events
– Frank van Puffelen
May 18 '17 at 23:28
Good work! This is what I'd call a more resilient client. But you'd still have inconsistency if the client app crashes between the completion of the creation of the user and it writing to the database. To further reduce chances of that, I'd move this code into Cloud Functions trigger of the user creation: firebase.google.com/docs/functions/auth-events
– Frank van Puffelen
May 18 '17 at 23:28
@FrankvanPuffelen How does the cloud function trigger have access to the data needed to populate user record? ("address, ...")
– cdock
May 23 '17 at 20:51
@FrankvanPuffelen How does the cloud function trigger have access to the data needed to populate user record? ("address, ...")
– cdock
May 23 '17 at 20:51
add a comment |
firebaser here
There are no cross-feature transactions in Firebase at the moment. The common approach is to:
- reduce the risk of cross-feature problems by carefully ordering your code
- increase the resilience of your code against cross-feature failures
This means you decide which one if more important: that each existing user has a database node or that each database node points to an existing user. You seem to want to answer "both", but as said: that's not possible, you'll have to pick. In most scenarios I've seen developers will pick option 1: every Firebase Authentication user must have a node in the database.
In that case, you'll want to run the code that registers a user in the database before actually registering the user with Firebase Authentication. And since the user only gets their UID once they do register with Auth, you'll need some two-stepped process here. All quite nasty code that is bound to have problems. Which is why you'll see that most developers with an app in production care a lot less about this approach than you think.
Instead they rely on regular clean-up of their database. They run an administrative process every day or so that scans the database for users without a corresponding Firebase Authentication registration. This handles all kinds of edge cases with a fairly simple process, even edge cases not related to registration. You might even call this "eventual consistency": eventually the data in the database will match the registered users.
Final shout-out on your original question: you can drastically reduce the chance of a cross-feature failure by running the register-and-write-to-database code in a Cloud Function for Firebase. Using the Admin SDK in a Cloud Function makes this all nice and tidy. But while the chance of failures reduces a lot, it can still fail. So if you care about the cleanliness of your data, you'll still need the clean-up process.
Does anybody know if cross-feature transactions are going to be supported in the future?
– Yulian
Aug 9 '18 at 13:31
While it's hard to say what will happen in the future, nobody is actively working on this at the moment.
– Frank van Puffelen
Aug 9 '18 at 14:39
Okay, thanks for helping me out.
– Yulian
Aug 9 '18 at 19:20
add a comment |
firebaser here
There are no cross-feature transactions in Firebase at the moment. The common approach is to:
- reduce the risk of cross-feature problems by carefully ordering your code
- increase the resilience of your code against cross-feature failures
This means you decide which one if more important: that each existing user has a database node or that each database node points to an existing user. You seem to want to answer "both", but as said: that's not possible, you'll have to pick. In most scenarios I've seen developers will pick option 1: every Firebase Authentication user must have a node in the database.
In that case, you'll want to run the code that registers a user in the database before actually registering the user with Firebase Authentication. And since the user only gets their UID once they do register with Auth, you'll need some two-stepped process here. All quite nasty code that is bound to have problems. Which is why you'll see that most developers with an app in production care a lot less about this approach than you think.
Instead they rely on regular clean-up of their database. They run an administrative process every day or so that scans the database for users without a corresponding Firebase Authentication registration. This handles all kinds of edge cases with a fairly simple process, even edge cases not related to registration. You might even call this "eventual consistency": eventually the data in the database will match the registered users.
Final shout-out on your original question: you can drastically reduce the chance of a cross-feature failure by running the register-and-write-to-database code in a Cloud Function for Firebase. Using the Admin SDK in a Cloud Function makes this all nice and tidy. But while the chance of failures reduces a lot, it can still fail. So if you care about the cleanliness of your data, you'll still need the clean-up process.
Does anybody know if cross-feature transactions are going to be supported in the future?
– Yulian
Aug 9 '18 at 13:31
While it's hard to say what will happen in the future, nobody is actively working on this at the moment.
– Frank van Puffelen
Aug 9 '18 at 14:39
Okay, thanks for helping me out.
– Yulian
Aug 9 '18 at 19:20
add a comment |
firebaser here
There are no cross-feature transactions in Firebase at the moment. The common approach is to:
- reduce the risk of cross-feature problems by carefully ordering your code
- increase the resilience of your code against cross-feature failures
This means you decide which one if more important: that each existing user has a database node or that each database node points to an existing user. You seem to want to answer "both", but as said: that's not possible, you'll have to pick. In most scenarios I've seen developers will pick option 1: every Firebase Authentication user must have a node in the database.
In that case, you'll want to run the code that registers a user in the database before actually registering the user with Firebase Authentication. And since the user only gets their UID once they do register with Auth, you'll need some two-stepped process here. All quite nasty code that is bound to have problems. Which is why you'll see that most developers with an app in production care a lot less about this approach than you think.
Instead they rely on regular clean-up of their database. They run an administrative process every day or so that scans the database for users without a corresponding Firebase Authentication registration. This handles all kinds of edge cases with a fairly simple process, even edge cases not related to registration. You might even call this "eventual consistency": eventually the data in the database will match the registered users.
Final shout-out on your original question: you can drastically reduce the chance of a cross-feature failure by running the register-and-write-to-database code in a Cloud Function for Firebase. Using the Admin SDK in a Cloud Function makes this all nice and tidy. But while the chance of failures reduces a lot, it can still fail. So if you care about the cleanliness of your data, you'll still need the clean-up process.
firebaser here
There are no cross-feature transactions in Firebase at the moment. The common approach is to:
- reduce the risk of cross-feature problems by carefully ordering your code
- increase the resilience of your code against cross-feature failures
This means you decide which one if more important: that each existing user has a database node or that each database node points to an existing user. You seem to want to answer "both", but as said: that's not possible, you'll have to pick. In most scenarios I've seen developers will pick option 1: every Firebase Authentication user must have a node in the database.
In that case, you'll want to run the code that registers a user in the database before actually registering the user with Firebase Authentication. And since the user only gets their UID once they do register with Auth, you'll need some two-stepped process here. All quite nasty code that is bound to have problems. Which is why you'll see that most developers with an app in production care a lot less about this approach than you think.
Instead they rely on regular clean-up of their database. They run an administrative process every day or so that scans the database for users without a corresponding Firebase Authentication registration. This handles all kinds of edge cases with a fairly simple process, even edge cases not related to registration. You might even call this "eventual consistency": eventually the data in the database will match the registered users.
Final shout-out on your original question: you can drastically reduce the chance of a cross-feature failure by running the register-and-write-to-database code in a Cloud Function for Firebase. Using the Admin SDK in a Cloud Function makes this all nice and tidy. But while the chance of failures reduces a lot, it can still fail. So if you care about the cleanliness of your data, you'll still need the clean-up process.
answered Mar 26 '17 at 15:45
Frank van PuffelenFrank van Puffelen
237k29382408
237k29382408
Does anybody know if cross-feature transactions are going to be supported in the future?
– Yulian
Aug 9 '18 at 13:31
While it's hard to say what will happen in the future, nobody is actively working on this at the moment.
– Frank van Puffelen
Aug 9 '18 at 14:39
Okay, thanks for helping me out.
– Yulian
Aug 9 '18 at 19:20
add a comment |
Does anybody know if cross-feature transactions are going to be supported in the future?
– Yulian
Aug 9 '18 at 13:31
While it's hard to say what will happen in the future, nobody is actively working on this at the moment.
– Frank van Puffelen
Aug 9 '18 at 14:39
Okay, thanks for helping me out.
– Yulian
Aug 9 '18 at 19:20
Does anybody know if cross-feature transactions are going to be supported in the future?
– Yulian
Aug 9 '18 at 13:31
Does anybody know if cross-feature transactions are going to be supported in the future?
– Yulian
Aug 9 '18 at 13:31
While it's hard to say what will happen in the future, nobody is actively working on this at the moment.
– Frank van Puffelen
Aug 9 '18 at 14:39
While it's hard to say what will happen in the future, nobody is actively working on this at the moment.
– Frank van Puffelen
Aug 9 '18 at 14:39
Okay, thanks for helping me out.
– Yulian
Aug 9 '18 at 19:20
Okay, thanks for helping me out.
– Yulian
Aug 9 '18 at 19:20
add a comment |
You can do it in your OnComplete method of createUserUsingEmailAndPassowrd().
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
//Create your user in DB here
}
}
});
is it possible that the user gets created and immediately i loose the connection (extreme paranoid) and the onComplete method fails. So i am left with the created user only. and not the data inside the db.
– Prakhar Sharma
Mar 26 '17 at 12:05
add a comment |
You can do it in your OnComplete method of createUserUsingEmailAndPassowrd().
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
//Create your user in DB here
}
}
});
is it possible that the user gets created and immediately i loose the connection (extreme paranoid) and the onComplete method fails. So i am left with the created user only. and not the data inside the db.
– Prakhar Sharma
Mar 26 '17 at 12:05
add a comment |
You can do it in your OnComplete method of createUserUsingEmailAndPassowrd().
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
//Create your user in DB here
}
}
});
You can do it in your OnComplete method of createUserUsingEmailAndPassowrd().
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
//Create your user in DB here
}
}
});
answered Mar 26 '17 at 11:51
Muhammad Farrukh FaizyMuhammad Farrukh Faizy
5721819
5721819
is it possible that the user gets created and immediately i loose the connection (extreme paranoid) and the onComplete method fails. So i am left with the created user only. and not the data inside the db.
– Prakhar Sharma
Mar 26 '17 at 12:05
add a comment |
is it possible that the user gets created and immediately i loose the connection (extreme paranoid) and the onComplete method fails. So i am left with the created user only. and not the data inside the db.
– Prakhar Sharma
Mar 26 '17 at 12:05
is it possible that the user gets created and immediately i loose the connection (extreme paranoid) and the onComplete method fails. So i am left with the created user only. and not the data inside the db.
– Prakhar Sharma
Mar 26 '17 at 12:05
is it possible that the user gets created and immediately i loose the connection (extreme paranoid) and the onComplete method fails. So i am left with the created user only. and not the data inside the db.
– Prakhar Sharma
Mar 26 '17 at 12:05
add a comment |
If you need user to have certain data to use app, then might have to always check.. when they sign in:
firebase.auth().onAuthStateChanged(user => {
if (user) {
// ... access ref to userData field(s) you care about..
someUserFieldRef.once('value').then(snap => {
if (! snap.exists()) {
// redirect to setup page to add missing data..
}
})
}
})
If they can use other parts of app, then you can defer check to when specific user data is necessary, get currentUser
, then check for data..
add a comment |
If you need user to have certain data to use app, then might have to always check.. when they sign in:
firebase.auth().onAuthStateChanged(user => {
if (user) {
// ... access ref to userData field(s) you care about..
someUserFieldRef.once('value').then(snap => {
if (! snap.exists()) {
// redirect to setup page to add missing data..
}
})
}
})
If they can use other parts of app, then you can defer check to when specific user data is necessary, get currentUser
, then check for data..
add a comment |
If you need user to have certain data to use app, then might have to always check.. when they sign in:
firebase.auth().onAuthStateChanged(user => {
if (user) {
// ... access ref to userData field(s) you care about..
someUserFieldRef.once('value').then(snap => {
if (! snap.exists()) {
// redirect to setup page to add missing data..
}
})
}
})
If they can use other parts of app, then you can defer check to when specific user data is necessary, get currentUser
, then check for data..
If you need user to have certain data to use app, then might have to always check.. when they sign in:
firebase.auth().onAuthStateChanged(user => {
if (user) {
// ... access ref to userData field(s) you care about..
someUserFieldRef.once('value').then(snap => {
if (! snap.exists()) {
// redirect to setup page to add missing data..
}
})
}
})
If they can use other parts of app, then you can defer check to when specific user data is necessary, get currentUser
, then check for data..
answered May 23 '17 at 21:08
cdockcdock
480710
480710
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f43028090%2fhow-to-create-user-and-upload-data-on-firebase-in-one-single-transaction%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown