es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ParseUser.saveInBackground no actualiza la base de datos.

Tengo un usuario de la siguiente manera:

@ParseClassName("User")
class User : ParseUser() {
    var firstName by ParseDelegate<string?>()
    var lastName by ParseDelegate<string?>()
}

Clase abierta ParseDelegate<t>:

open class ParseDelegate<t> {
    @Suppress("UNCHECKED_CAST")
    operator fun getValue(parseObj: ParseObject, propertyMetadata: KProperty<*>): T {
        return parseObj.get(propertyMetadata.name) as T
    }

    operator fun setValue(parseObj: ParseObject, propertyMetadata: KProperty<*>, a: Any?) {
        if (a != null) {
            parseObj.put(propertyMetadata.name, a)
            parseObj.saveEventually()
        }
    }
}

Luego, una configuración así:

val parseBuilder = Parse.Configuration.Builder(this)
            .applicationId(BuildConfig.PARSE_APP_ID)
            .server(BuildConfig.PARSE_SERVER)

ParseUser.registerSubclass(User::class.java)

Parse.initialize(parseBuilder.build())

Intento editarlo de esta manera:

val user = ParseUser.getCurrentUser() as User
user.firstName = newFirstName
user.lastName = newLastName

user.saveInBackground {
    if (it == null) {
        Timber.d("[user] cambios de usuario guardados")
    }

    it?.apply { Timber.d("[user] problema al guardar cambios de usuario ${it.message}") }
}

El guardado activa el bloque de cambios guardados, y si navego fuera de ese fragmento y vuelvo, los cambios se guardan en ParseUser.getCurrentUser. Sin embargo, cuando voy a mi base de datos Parse en la nube, los cambios no se han guardado y el nombre y apellido siguen siendo nulos.

¿Alguna pista sobre qué estoy haciendo mal?</string?></string?>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás heredando la clase ParseUser con tu clase User y utilizando la clase ParseDelegate para mapear propiedades a campos de Parse. Sin embargo, cuando intentas guardar cambios en el usuario actual, lo estás casteando a User en lugar de ParseUser.

    En lugar de castear el resultado de ParseUser.getCurrentUser() como User, deberías castearlo como ParseUser y luego obtener las propiedades mapeadas utilizando sus getters y setters. Aquí tienes un ejemplo:

    val user = ParseUser.getCurrentUser()
    user.put("firstName", nuevoNombre)
    user.put("lastName", nuevoApellido)
    
    user.saveInBackground {
        if (it == null) {
            Timber.d("[user] cambios de usuario guardados")
        }
        it?.apply { Timber.d("[user] error al guardar cambios de usuario ${it.message}") }
    }
    

    Al utilizar el método put en el objeto ParseUser, podrás guardar las actualizaciones en los campos correspondientes en la base de datos de Parse. Esto también debería guardar tus cambios en la base de datos en la nube.

Comments are closed.