Cómo deshacer una llamada ParseUser.setPassword ()?

Estoy permitiendo que el usuario cambie sus credenciales. Escribe el nuevo nombre de usuario, correo electrónico y contraseña y voy como:

ParseUser user = ParseUser.getCurrentUser(); user.setUsername("MY NEW NAME"); user.setEmail(email); user.setPassword("MY NEW PW"); user.saveInBackground(...); 

¿Y qué? Así que esta llamada save() puede fallar, por un gran número de razones (ejemplo: nombre de usuario ya tomado por otra persona). Puedo decir que en este caso ninguno de los campos anteriores se actualiza, lo cual es justo: muestro un error, el usuario sabe que todo salió mal.

Las cosas se complican si observa que, incluso después de la ParseException , el user anterior mantiene sus campos sucios, que no se pueden guardar en el servidor. Es decir

 //saveInBackground fails //... user.getUsername().equals("MY NEW NAME") // true! 

Problema

Ahora, puedo conseguir estos campos de nuevo a los valores correctos llamando a user.fetch() , pero esto no trabaja con el campo de la password .

Esto es particularmente no deseado, porque cualquier futura llamada a save() o tal (que no podría fallar porque tal vez es una llamada completamente diferente) actualizará la contraseña también! Es decir

 //later ParseUser user = ParseUser.getCurrentUser(); user.put("stuff"); user.save(); 

Esto no sólo pondrá "cosas", sino también cambiar la contraseña a "MY NEW PW" .. sin el usuario nunca saber.

¿Hay alguna forma de restablecer el campo de password local, aparte de fetch() que no funciona? Sé que podría guardar nombre de usuario, correo electrónico y contraseña con tres consultas diferentes, pero que no es una posible solución para mi caso.

Una solución podría ser utilizar

 + becomeInBackground: 

En la clase PFUser (con PFUser.currentUser (). SessionToken como token) cuando se produce un error de guardado, pero eso sigue siendo un riesgo para que fallenInBackground falle. Podría por lo menos prevenir algunos casos a happend si becomeInBackground deshace eficazmente setPassword, y acepta sessionToken actual como parámetro, no he probado eso

Si fuera mi problema trataría de crear primero un usuario antiguo y guardar todos los datos actuales, y cuando fallara, sería el momento de cambiar todo de vuelta al valor normal, o si el éxito es el momento de matar el usuario antiguo. Espero que pueda ayudar.

El texto sin formato de contraseña no se almacena en Parse y como tal no puede ser obtenido por su aplicación. Encontrado aquí https://www.parse.com/questions/get-current-users-password-to-compare-it-with-a-string

Si desea cambiar la contraseña puede utilizar ParseUser.requestPasswordResetInBackground() para que cambie la contraseña con la ayuda de correo electrónico.

Pero si necesita obtener la contraseña realmente difícil, puede almacenarla en SharedPreferences después del inicio de sesión.

Después de algunas pruebas y comprobaciones, he aquí alguna conclusión.

  1. En parse, "password" es un campo especial , no puede acceder a él por ParseUser, así es ParseUser tiene setPassword () pero no tiene método getPassword ()
  2. Incluso en la gestión de back-stage [Core] – [Datos] – [Usuario], puede ver el campo "contraseña" está oculto
  3. Es por eso que el método fetch () no puede recuperar el valor original de "contraseña"

Por lo tanto, creo que si quieren implementos por encima de lo que necesita, intente de esta manera

 // First time register // ParseUser user = ParseUser.getCurrentUser(); user.setUsername("MY NAME"); user.setEmail(email); user.setPassword("MY PW"); user.put("_password", "MY PW"); // The key can't use "password", this's reserve key word in Parse // user.saveInBackground(...); // Next time update // user.setUsername("MY NEW NAME"); user.setPassword("MY NEW PW"); user.saveInBackground(...); // if have something exception // user.fetch(); // user.setPassword(user.get("_password")); user.save(); ParseUser.login("MY NAME", "MY PW"); // Error ParseUser.login("MY NAME", "MY NEW PW"); // Ok user.fetch(); user.setPassword(user.get("_password")); user.save(); ParseUser.login("MY NAME", "MY PW"); // OK 

En cuanto a la última versión que he leído en el changelog:

V1.10.2 – 15 DE SEPTIEMBRE DE 2015

Nuevo: Añadido ParseObject.revert () y revertir (clave) para permitir revertir cambios sucios

Parece que esto podría ser. Era definitivamente necesario.

  • Spinner Error "El recuento del tipo de vista del adaptador de Spinner debe ser de 1"
  • Descargar imagen a través de la función Parse Cloud Code
  • Cargar una imagen en ImageView (Parse.com)
  • Java.lang.NoClassDefFoundError: com.parse.Parse
  • Android: Añadir usuarios a Parse a través de Facebook, usando su 'ParseFacebookUtils`
  • Empuje usando Parse en Qt5.5 para Android: NullPointerException en getCurrentInstallation
  • Parse SDK Android - API de gráficos de Facebook v2.0
  • Parse Push JSON problema de datos en Android
  • ParseInstallation.SaveAsync () que causa UnhandledException en formularios Xamarin Android
  • RecyclerView notifyDataSetChanged no funciona después de la consulta de análisis
  • Parse.com: con parseUser, ¿cómo puedo guardar datos en una columna que he creado en parse de la clase?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.