我正在嘗試從 db 獲取資料。但問題是 Datasnapshot 結果不正確。結果子項有一個額外的元素,它是 db 中的最后一個元素。你能說我做錯了什么嗎?
Unity3D 版本:2019.2.18f1 Firebase 版本:8.6.1
資料:
"0" : {
"deskID" : 0,
"deskName" : "Sol i? 1"
},
"1" : {
"deskID" : 1,
"deskName" : "Sol i? 2"
},
"2" : {
"deskID" : 2,
"deskName" : "Sol i? 3"
},
"3" : {
"deskID" : 3,
"deskName" : "Sa? i? 1"
},
"4" : {
"deskID" : 4,
"deskName" : "Sa? i? 2"
},
"5" : {
"deskID" : 5,
"deskName" : "Sa? i? 3"
},
"6" : {
"deskID" : 6,
"deskName" : "Sol d?? 1"
},
"7" : {
"deskID" : 7,
"deskName" : "Sol d?? 2"
},
"8" : {
"deskID" : 8,
"deskName" : "Sa? d?? 1"
},
"9" : {
"deskID" : 9,
"deskName" : "Sa? d?? 2"
},
"10" : {
"deskID" : 10,
"deskName" : "Sa? d?? 3"
},
"11" : {
"deskID" : 11,
"deskName" : "Sa? d?? 4"
},
"12" : {
"deskID" : 12,
"deskName" : "Sa? d?? 5"
},
"13" : {
"deskID" : 13,
"deskName" : "Sa? d?? 6"
},
"9999" : {
"deskID" : 9999,
"deskName" : "Personel"
}
},
使用獲取資料的函式:
FirebaseDatabase.DefaultInstance.GetReference("desks").GetValueAsync().ContinueWithOnMainThread((task) =>
{
Desks desks = new Desks();
if (task.IsFaulted)
{
Debug.Log("error read desk data");
}
else if (task.IsCompleted)
{
DataSnapshot snapshot = task.Result;
Debug.Log(snapshot.ChildrenCount);
if (snapshot.ChildrenCount > 0)
{
foreach (DataSnapshot snapshotChild in snapshot.Children)
{
try
{
Desk desk = JsonUtility.FromJson<Desk>(snapshotChild.GetRawJsonValue());
Debug.Log(desk.deskName);
desks.desks.Add(desk);
}catch(Exception ex)
{
Debug.Log(snapshotChild.Key);
Debug.Log(snapshotChild.Value);
Debug.Log(ex.Data);
Debug.Log(ex.Message);
}
}
}
這是日志資料。如您所見,最后一個元素是“9999”->deskID = 9999,deskName =“Personel”。但是在日志中,您可以看到最后一個元素桌面 ID 和桌面名稱在結果中顯示為快照子項。
日志資料
編輯:
首先,我想更多地解釋結果資料有什么問題。我的結果串列必須是 15 個孩子。但有時結果得到17個孩子。第 16 個孩子的密鑰:'deskID' 和值:'9999' 和第 17 個孩子的密鑰:'deskName' 和值:'Personel'。
書桌類:
[Serializable]
public class Desk
{
public int deskID;
public string deskName;
}
After Frank van Puffelen's answer this error is gone. I tried 30 times and get exact data from database.
uj5u.com熱心網友回復:
您很可能會看到 Firebase 的陣列強制轉換的結果。當您檢索其鍵看起來像陣列索引的資料時,Firebase SDK 和 REST API 會將結果轉換為陣列。如果陣列中的一些鍵丟失,則這些鍵會被null值填充。
為防止發生這種情況,請勿對鍵使用連續數值。相反,無論是使用火力地堡的原生推鍵,或者給你的數字鍵短字串前綴,以防止陣列脅迫,即key_0,key_1等等。
有關更多資訊,請參閱最佳實踐:Firebase 中的陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359426.html
標籤:c# firebase unity3d firebase-realtime-database
