Android studio - Kotlin - Invalid Firebase Database (Tuto Graven)
Bonjour,
ce message fait suite à un précédent sur une connexion impossible à Firebase.
J'ai créé un projet en suivant le tuto de graven sur du Kotlin.
J'ai trois fragment sur mon code, sur deux d'entre eux, j'arrive à interagir avec ma database Firebase mais sur la dernière qui me permet d'ajouter des éléments en base, j'ai une erreur.
A noter également que le formulaire me permet d'ajouter des photos sur le storage Firebase (via Bucket) et ça fonctionne. A chaque essai, bien que l'appli s'arrête une fois que j'appui sur le bouton "terminer" la photo est bien stocké mais les autres informations n'arrivent pas en base et j'ai les messages suivants
Citation:
D/EGL_emulation: eglMakeCurrent: 0xe7a05600: ver 2 0 (tinfo 0xe7a03870)
E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.firebase.internal.api.FirebaseNoSignedInUserException: Please sign in before trying to get a token.
W/NetworkRequest: no auth token for request
Citation:
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: fr.asmathvic.arakbet, PID: 4888
com.google.firebase.database.DatabaseException: Invalid Firebase Database path:
https://firebasestorage.googleapis.c...0-74bf8cea7879. Firebase Database paths must not contain '.', '#', '$', '[', or ']'
at com.google.firebase.database.core.utilities.Validation.validatePathString(com.google.firebase:firebase-database@@19.2.1:45)
at com.google.firebase.database.DatabaseReference.child(com.google.firebase:firebase-database@@19.2.1:102)
at fr.asmathvic.arakbet.PlantRepository.insertPlant(PlantRepository.kt:94)
at fr.asmathvic.arakbet.fragments.AddPlantFragment$sendForm$1.invoke(AddPlantFragment.kt:71)
at fr.asmathvic.arakbet.fragments.AddPlantFragment$sendForm$1.invoke(AddPlantFragment.kt:52)
at fr.asmathvic.arakbet.PlantRepository.uploadImage$lambda-2(PlantRepository.kt:80)
at fr.asmathvic.arakbet.PlantRepository.$r8$lambda$IaW8al3iR-y22PA45nXW4WrV0QM(Unknown Source:0)
at fr.asmathvic.arakbet.PlantRepository$$ExternalSyntheticLambda1.onComplete(Unknown Source:2)
at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
I/Process: Sending signal. PID: 4888 SIG: 9
Dans mon "PlantRepository" qui me permet d'intéragir avec la BDD, j'ai ces éléments.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| class PlantRepository {
// Donner le lien pour accéder au bucket
private val BUCKET_URL: String ="gs://arXXXX-1932d.appspot.com"
// Se connecter à notre espace de stockage
val storageReference = FirebaseStorage.getInstance().getReferenceFromUrl(BUCKET_URL)
object Singleton{
// Se connecter à la reférence "plants"
val databaseRef = FirebaseDatabase.getInstance("https://arXXXX-1932d-default-rtdb.firebaseio.com/").getReference("plants")
// Créer une liste qui va contenir nos plantes
val plantList = arrayListOf<PlantModel>()
// Contenir le lien de l'image courante
var downloadUri: Uri?=null
}
fun updateData(callback: () -> Unit){
// Absorber les données depuis la databaseRef pour les donner à notre liste de plantes
databaseRef.addValueEventListener(object : ValueEventListener{
override fun onDataChange(p0: DataSnapshot) {
//Retirer les ancienenes plantes
plantList.clear()
//Recolter la liste
for (ds in p0.children) {
//Construire un objet plante
val plant = ds.getValue(PlantModel::class.java)
//Vérifier que la plante n'est pas nulle
if (plant != null) {
//Ajouter la plante à la liste
plantList.add(plant)
}
}
//Actionner le Callback
callback()
}
override fun onCancelled(p0: DatabaseError) {}
})
}
//Créer une fonction pour envoyer des fichiers sur le storage
fun uploadImage(file:Uri, callback: () -> Unit){
//Vérifier que ce fichier ne soit pas null
if (file != null){
val fileName = UUID.randomUUID().toString() + ".jpg"
val ref = storageReference.child(fileName)
val uploadTask = ref.putFile(file)
// Demarer la tâche d'envoi
uploadTask.continueWithTask(Continuation<UploadTask.TaskSnapshot, Task<Uri>>{ task ->
// s'il y a eu un problème lors de l'envoi du fichier
if (!task.isSuccessful){
task.exception?.let { throw it}
}
return@Continuation ref.downloadUrl
}).addOnCompleteListener { task ->
//Vérifier si tout a bien fonctionné
if (task.isSuccessful){
//Récupére l'image
downloadUri = task.result
callback()
}
}
}
}
//Mettre à jour un objet plante en bdd
fun updatePlant(plant: PlantModel){
databaseRef.child(plant.id).setValue(plant)
}
//Inserer une nouvelle plante en BDD
fun insertPlant(plant: PlantModel){
databaseRef.child(plant.id).setValue(plant)
}
//Supprimer une plante de la BDD
fun deletePlant(plant: PlantModel) = databaseRef.child(plant.id).removeValue()
} |
Je débute dans le développement, j'aimerai vraiment comprendre ce qui ne fonctionne pas afin d'avancer sereinement.
Merci par avance, et hésitez pas à me demander des info complémentaires qui pourraient vous aider à analyser le problème.
Merci
Android studio - Kotlin - Invalid Firebase Database
Bonsoir,
Je ne sais pas si ton problème est toujours d'actualité, mais s'il l'est, voila le code qui fonctionne correctement chez moi :D :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| class PlantRepository {
object Singleton {
// donner le lien pour acceder au bucket
private val BUCKET_URL: String = "gs://nature-collection-7f652.appspot.com"
// se connecter à notre espace de stockage
val storageReference = FirebaseStorage.getInstance().getReferenceFromUrl(BUCKET_URL)
// se connecter à la référence "plants"
val databaseRef=FirebaseDatabase.getInstance().getReference("plants")
// créer une liste qui va contenir nos plantes
val plantList = arrayListOf<PlantModel>()
// contenir le lien de l'image courante
var downloadUri: Uri? = null
}
fun updateData(callback: () -> Unit) {
// absorber les données depuis la databaseRef -> liste de plantes
databaseRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
// retirer les anciennes plantes
plantList.clear()
// récolter la liste
for (ds in snapshot.children) {
// construire un objet plante
val plant = ds.getValue(PlantModel::class.java)
// verifier que la plante n'est pas null
if(plant != null) {
// ajouter la plante à notre liste
plantList.add(plant)
}
}
// actionner le callback
callback()
}
override fun onCancelled(error: DatabaseError) {}
})
}
// creer une fonction pour envoyer des fichiers sur le storage
fun uploadImage(file: Uri, callback:() -> Unit) {
// verifier que ce fichier n'est pas null
if(file != null) {
val fileName = UUID.randomUUID().toString() + ".jpg"
val ref = storageReference.child(fileName)
val uploadTask = ref.putFile(file)
// démarrer la tache d'envoi
uploadTask.continueWithTask(com.google.android.gms.tasks.Continuation<UploadTask.TaskSnapshot, Task<Uri>> { task ->
// si il y a eu un pb lors de l'envoi du fichier
if(!task.isSuccessful) {
task.exception?.let { throw it }
}
return@Continuation ref.downloadUrl
}).addOnCompleteListener { task ->
// verifier si tout a bien fonctionné
if(task.isSuccessful) {
// recuperer l'image
downloadUri = task.result
callback()
}
}
}
}
// mettre à jour un objet plante en BDD
fun updatePlant(plant: PlantModel) = databaseRef.child(plant.id).setValue(plant)
// inserer une nouvelle plante en BDD
fun insertPlant(plant: PlantModel) = databaseRef.child(plant.id).setValue(plant)
// supprimer une plante de la base
fun deletePlant(plant: PlantModel) = databaseRef.child(plant.id).removeValue()
} |
Bonne chance.