Firebase 实时数据库在 Unity3d 中的结果上添加了额外的元素
Firebase realtime database is adding extra element on result in Unity3d
我正在尝试从数据库获取数据。但问题是 Datasnapshot 结果不正确。结果 children 有一个额外的元素,它是 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”。但是在日志中,您可以看到最后一个元素 deskID 和 deskName 在结果中显示为快照 child。
log data
编辑:
首先我想多解释一下结果数据有什么问题。
我的结果列表必须是 15 children。但有时结果会得到 17children。第 16 个 child 的键:'deskID' 和值:'9999' 和第 17 个 child 的键:'deskName' 和值:'Personel'.
办公桌class:
[Serializable]
public class Desk
{
public int deskID;
public string deskName;
}
在 Frank van Puffelen 的回答之后,这个错误就消失了。我尝试了 30 次并从数据库中获取了准确的数据。
您很可能看到的是 Firebase 的数组强制转换的结果。当您检索其键类似于数组索引的数据时,Firebase SDK 和 REST API 会将结果转换为数组。如果数组中的一些键丢失,这些键将填充 null
个值。
为防止这种情况发生,请不要为您的键使用顺序数值。相反,要么使用 Firebase 的本机按键,要么为您的数字键提供一个短字符串前缀以防止数组强制转换,即 key_0
、key_1
等
有关详细信息,请参阅 Best Practices: Arrays in Firebase。
我正在尝试从数据库获取数据。但问题是 Datasnapshot 结果不正确。结果 children 有一个额外的元素,它是 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”。但是在日志中,您可以看到最后一个元素 deskID 和 deskName 在结果中显示为快照 child。
log data
编辑:
首先我想多解释一下结果数据有什么问题。 我的结果列表必须是 15 children。但有时结果会得到 17children。第 16 个 child 的键:'deskID' 和值:'9999' 和第 17 个 child 的键:'deskName' 和值:'Personel'.
办公桌class:
[Serializable]
public class Desk
{
public int deskID;
public string deskName;
}
在 Frank van Puffelen 的回答之后,这个错误就消失了。我尝试了 30 次并从数据库中获取了准确的数据。
您很可能看到的是 Firebase 的数组强制转换的结果。当您检索其键类似于数组索引的数据时,Firebase SDK 和 REST API 会将结果转换为数组。如果数组中的一些键丢失,这些键将填充 null
个值。
为防止这种情况发生,请不要为您的键使用顺序数值。相反,要么使用 Firebase 的本机按键,要么为您的数字键提供一个短字符串前缀以防止数组强制转换,即 key_0
、key_1
等
有关详细信息,请参阅 Best Practices: Arrays in Firebase。