2017-03-15 32 views
0

我只是遇到了火力和多数民众似乎正是我需要的。目前我正在尝试在我的团结项目中实施它,但首先我只是测试一下以适应它。火力地堡数据库 - 儿童值到UI文本

谁能告诉我怎么可以很容易地只收到一个孩子的价值在我的数据库,并将其保存在我的统一项目的变量?最后,我想在UI文本中显示值。它并不需要真正的动态。越容易越好,所以我可以肯定地理解它。

它尝试了如下:

variableXY.text = FirebaseDatabase.DefaultInstance.GetReference ("Databasename").Child ("Childname").GetValueAsync().ToString(); 

其结果是,它显示文本:System.Threading.Task.Task1 [Firebase.Database.Datasnapshot]

只使用该值是需要。

我将十分感谢,如果有人可以帮助我

非常感谢!

只是现在这可能使事情更清晰的显示我的完整代码。

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.UI; 
using Firebase; 
using Firebase.Database; 
using Firebase.Unity.Editor; 

public class DBManager: MonoBehaviour { 

    public Text MA1Sensor1; 
    public Text MA1Sensor2; 

    void Start() { 


     // Set up the Editor before calling into the realtime database. 
     FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("https://unityar-6eb13.firebaseio.com/"); 

     // Get the root reference location of the database. 
     DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference; 
     FirebaseDatabase.DefaultInstance 
      .GetReference("MA1") 
      .ValueChanged += HandleValueChanged; 

    } 

    void HandleValueChanged(object sender, ValueChangedEventArgs args) { 
     if (args.DatabaseError != null) { 
      Debug.LogError(args.DatabaseError.Message); 
      return; 
     } 

     Debug.Log (args.Snapshot.GetRawJsonValue()); 
     MA1Sensor1.text = FirebaseDatabase 
      .DefaultInstance 
      .GetReference ("MA1") 
      .Child ("Zaehler") 
      .GetValueAsync() 
      //.Result 
      .ToString(); 
     Debug.Log (MA1Sensor1.text); 

    } 


    // Update is called once per frame 
    void Update() { 

    } 
} 

回答

0

的火力地堡SDK使用任务将值异步返还给您。 检出this link如何检索值。

如果您位于Unity协程中以使其更简单,您还可以使用Unity的“WaitUntil”。请注意,您可以使用DataSnapShot.Value得到解析值或GetRawJsonValue()如果你想看看下面的JSON。在最简单的情况下,你需要价值。如果您使用的是类型化对象和Unity的Json序列化,则可以使用“GetRawJsonValue()”。

var getTask = FirebaseDatabase 
    .DefaultInstance 
    .GetReference ("MA1") 
    .Child ("Zaehler") .GetValueAsync(); 

yield return new WaitUntil(() => getTask.IsCompleted || getTask.IsFaulted); 

if (getTask.IsCompleted) { 
    Debug.Log(getTask.Result.Value.ToString()); 
} 
0

异步操作基本上应该在后台运行,并在需要时无法awaitable Task秒。
原因,为什么你的文字是System.Threading.Task.Task1[Firebase.Database.Datasnapshot]是非常简单的。
既然你打电话GetValueAsync()返回System.Threading.Task<Firebase.Database.Datasnapshot>类型的对象,你试着拨打ToString()方法与得到的结果typename的。

要解决此问题,您可以在GetValueAsync()之后添加Result,这将等待结果,然后致电ToString()

例如:

variableXY.text = FirebaseDatabase 
        .DefaultInstance 
        .GetReference ("Databasename") 
        .Child ("Childname") 
        .GetValueAsync() 
        .Result // wait for the result of asynchronous operation 
        .ToString(); 
+0

哇,谢谢你真的很快的回答。 不幸的是,当我尝试运行并结合命令时,它总是崩溃我的团结。 有什么建议吗? 因为你说异步是为了后台操作,你认为它是我的案例的正确选择?该命令放置在“Value Changed事件”中,并且它假定更新该值。该值可能在每秒稍后改变,此外应该显示8个值。我想显示一些传感器活的da。你对此有何看法? 再次感谢您 – Cruzad0r

+0

我认为这是使用Unity时的错误选择。我会使用同步调用或使用不同的线程来处理数据库通信。 –

+0

是的,我认为有时候这样认为,但是它是增强现实和物品检测程序的一部分,所以到目前为止统一是必要的。 这将如何与同步呼叫一起工作? 谢谢 – Cruzad0r

0

如果我似乎已经是相当不错的UI文本显示.GetRawJsonValue()的值。数据库中的更改将立即在统一项目中完成。我能不能只参加Json价值的一部分?

现在它显示以下RawJson:

{"Program":1,"Zaehler":600} 

只是把 “计划” S Childvalue的价值为变量A和 “ZAEHLER” S Childvalue到变量B应该工作。我知道它很肮脏,但为了测试它现在只需要工作。那么,我能以某种方式获得RawJson的派对吗?

不能心存感激不够;)