Таймер не обновляет базу данных Firebase в C # - PullRequest
0 голосов
/ 21 сентября 2019

Я подхожу к проблеме, когда у меня есть способ получить таймер, и когда игра заканчивается, я хочу обновить таймер в моей базе данных Firebase.Я отлаживаю свой метод ниже, я получаю дату, но мой URL базы данных (база данных) не обновляется, пока.Есть ли способ, который я могу решить с помощью моего кода ниже?Спасибо за помощь.

Вот мой код:

        public void TrackTimer()
    {
        var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://MY_PROJECT_URL.firebaseio.com/timer/timer/time.json");
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "PUT";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {

            string time = System.DateTime.Now.ToString("T");
            timeTrack = time; 
            streamWriter.Write(time);

        }
        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var result = streamReader.ReadToEnd();

        }

    } 

1 Ответ

0 голосов
/ 22 сентября 2019

Я не эксперт по Firebase.

Но вместо прямых запросов Http я бы предпочел использовать выделенный Firebase Unity SDK , а затем вы можете просто следовать инструкции для ИзвлечениеДанные и Сохранить данные .Я бы предположил, что вы используете «Базу данных в реальном времени».

Сначала вам всегда нужно инициализировать вашу ссылку

public class FirebaseController : MonoBehaviour 
{
    DatabaseReference reference

    private void Start() 
    {

        // Set these values before calling into the realtime database.
        FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("https://YOUR-FIREBASE-APP.firebaseio.com/");

        // If usig restricted access then also do
        //FirebaseApp.DefaultInstance.SetEditorP12FileName("YOUR-FIREBASE-APP-P12.p12");
        //FirebaseApp.DefaultInstance.SetEditorServiceAccountEmail("SERVICE-ACCOUNT-ID@YOUR-FIREBASE-APP.iam.gserviceaccount.com");
        //FirebaseApp.DefaultInstance.SetEditorP12Password("notasecret");

        // Get the root reference location of the database.
        DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference;
    }

    ...
}

Сохранить данные

  1. Если вы используете JSON, вам нужна соответствующая структура для ваших данных в виде классов C #.Поскольку я не знаю вашу структуру данных, я просто воспользуюсь примерами из руководства по Firebase здесь

    // I would always make these classes serializable so you can directly 
    // also see, edit and save them via the Inspector
    [Serializable]
    public class User 
    {
        public string username;
        public string email;
    
        public User() 
        {
        }
    
        public User(string username, string email) 
        {
            this.username = username;
            this.email = email;
        }
    }
    

    Затем вы можете сохранить данные в формате json, например

    private void writeNewUser(string userId, string name, string email) 
    {
        User user = new User(name, email);
        string json = JsonUtility.ToJson(user);
    
        reference.Child("users").Child(userId).SetRawJsonValueAsync(json);
    }
    
  2. Или вместо этого используйте полный путь в структуре firebase, чтобы установить только одно значение без необходимости использования JSON и соответствующего класса в c #, используя

     reference.Child("users").Child(userId).Child("username").SetValueAsync(name);
    

Получение данных

Для извлечения вы делаете то же самое

reference.Child("users").GetValueAsync().ContinueWith(task => 
{
    if (task.IsFaulted) 
    {
        // Handle the error...
    }
    else if (task.IsCompleted) 
    {
        DataSnapshot snapshot = task.Result;
        // Do something with snapshot...

        // Again either using a JSON
        var user = JsonUtility.FromJson<User>(snapshot.Child(userId).GetRawJsonValue());
        var username = user.username;

        // OR using the path to get a single value
        var username = (string)snapshot.Child(userId).Child("username").Value();


        // Now do something with the received data
    }
});

Примечание : Как я видел это довольно часто здесь, на SO, есть также небольшая проблема с threading и ContinueWith заканчиваются в потоке, где вы не можете вызывать API Unity.Поэтому вам, вероятно, лучше выбрать ContinueWithOnMainThread вместо


Как уже говорилось, я не специалист по пожарной базе, а только пытаюсь понять и привести пример, следуя ссылкам руководств... нет гарантии, что так работают эти методы;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...