[DB-RS] RestClient / Firebase

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
skyfyx
Messages : 15
Inscription : 14 Avr 2020 01:53

[DB-RS] RestClient / Firebase

Message par skyfyx » 29 Avr 2020 01:56

Bonjour/Bonsoir,

Je viens vers vous car j'ai une "erreur" vraiment étrange avec Firebase et RestClient (asset unity).
Le problème survient quand j'insère une nouvelle donnée, une fois ça me donnera le résultat escompté et une autre fois un tableau ( que je ne veux pas ) avec pour Key "null".

Voici mon code ( si vous voyez une erreur hésitez pas ) :
Mon fichier 'bddHandler'

Code : Tout sélectionner

// le projectId est egal a mon id de projet ( en private const string )
private static readonly string databaseURL = $"https://{projectId}.firebaseio.com/";
public delegate void PostMobCallback();

    /// <summary>
    /// Ajout d'un mob en bdd
    /// </summary>
    /// <param name="mob"> mon objet mob </param>
    /// <param name="mobId"> l'id de mon mob qui sera l'id dans firebase </param>
    /// <param name="callback"> le callback si tout se passe bien </param>
    
public static void PostMob(Monster mob, string mobId, PostUserCallback callback)
{
	RestClient.Put<Monster>($"{databaseURL}mobs/{mobId}.json", mob).Then(response => { callback(); });
}
Et voici mon Fichier Monster:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Monster
{
 	public string name;
 	public string description; 
 	public int life;
 	
 	// constructeur
 	public Monster(string name, string description, int life){
 		this.name = name;
 		this.description = description;
 		this.life = life;
 		
 	}
}
Et pour finir mon main attaché à la caméra qui appelle la fonction qui va poster le mob :

Code : Tout sélectionner

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
    private static void OnAppStart()
    {
    	var newMob = new Monster("Chat", "La description d'un chat", 300);

    	DatabaseHandler.PostMob(newMob, "5", () => 
    	{
		Debug.Log("mob créer");
    	});
    }
Normalement avec ce code sur firebase, je suis censé obtenir une structure simple ( voici en json ) :

Code : Tout sélectionner

{
"mobs" : {
    "5" : {
      "name" : "Chat",
      "description" : "La description d'un chat",
      "life" : 300
    },
    "6" : {
      "name" : "Un autre chat",
      "description" : "La description d'un autre chat",
      "life" : 400
    }
}
Alors oui ça marche mais pas tout le temps. En ne changeant rien au code , juste l'id j'ai la plupart du temps quelques chose comme ça:

Code : Tout sélectionner

{
  "mobs" : [ null, null, null, {
    "description" : "La description d'un chat",
    "life" : 300,
    "name" : "Chat"
  }, {
    "description" : "Un Zombie tout mignon",
    "life" : 300,
    "name" : "Zombie"
  }, {
    "description" : "La description d'un autre chat",
    "life" : 400,
    "name" : "Un autre chat"
  } ]
 }
Je cherche, fais des retouches mais ne trouve rien , je me tourne vers vous les experts, car là je suis désemparé.

Si vous n'avez rien qu'une piste je prends.
Dernière édition par skyfyx le 29 Avr 2020 20:22, édité 3 fois.

Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: [DB-RS] RestClient / Firebase

Message par jmhoubre » 29 Avr 2020 10:11

A part la dizaine de fautes d'orthographe qui rend le texte un peu pénible à lire, je n'ai rien vu qui saute aux yeux.
Juste quelques questions, liées à la gestion générale d'une base de données :
- A quel moment vérifies-tu que le mobId est unique ?
- C'est Firebase qui le fait ?
- Que renvoie Firebase quand on veut insérer un monstre qui a le même mobId qu'un monstre déjà en base ?
- Je ne connais pas Firebase, mais si c'est un moteur de BDD correct, il a probablement la capacité à générer automatiquement des identifiants unique (ce sont généralement des entiers avec quelques chose du genre AutoIncrement). Si c'est le cas, pourquoi ne pas utiliser cette possibilité confortable ?

skyfyx
Messages : 15
Inscription : 14 Avr 2020 01:53

Re: [DB-RS] RestClient / Firebase

Message par skyfyx » 29 Avr 2020 20:18

Tout d'abord merci pour ta réponse.

Oui apparemment Firebase gère automatiquement les Id, ce qu'il se passe quand j'essaye de modifier un champ d'un objet déjà existant, c'est qu'il modifie tout seul le champ en question et me renvoi "200".
Rien d'anormal en soit.

Firebase ne gère pas de base de donnée comme Mysql mais plutôt du Json, donc NoSql de ce que j'ai compris. (comme mongoDB j'imagine, d'habitude je suis plutôt PHP -> SQL pour mes projets Unity , mais comme j'ai bossé 8 ans en JS et nodeJS et mongoDB, je voulais me tourner vers un stockage d'objets/Collections)
Pour ce qui est de vérifier l'id, car je sais que ce n'est pas l'idéal, la c'est juste des tests pour comprendre comment ça marche. Mais apparemment je dois louper un truc.

On m'a conseillé de faire des tests avec "Postman" ce que je suis en train de faire, mais j'obtiens le même résultat..

Je me demande si je devrais pas plutôt laisser le choix à Firebase ( tout comme mongoDB ) de créer des identifiants uniques, au lieu de vouloir lui en indiquer (du coup passer par un POST plutôt qu'un PUT ).

Ps: désolé pour les fautes d'orthographe faite dans le code, la plupart du temps quand je fais mes tests, je m'applique pas sur ça dans mes commentaires :)

Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: [DB-RS] RestClient / Firebase

Message par jmhoubre » 29 Avr 2020 21:33

Je me demande si je devrais pas plutôt laisser le choix à Firebase ( tout comme mongoDB ) de créer des identifiants uniques, au lieu de vouloir lui en indiquer (du coup passer par un POST plutôt qu'un PUT ).
Oui, c'est un peu ce que je suggérais (Si c'est le cas, pourquoi ne pas utiliser cette possibilité confortable ?).

Répondre

Revenir vers « (C#) CSharp »