【问题标题】:Firebase Database giving inconsistent dataFirebase 数据库提供不一致的数据
【发布时间】:2021-11-28 18:21:15
【问题描述】:

我有一个连接到 firebase 实时数据库的颤振应用程序。每次我尝试检索数据时,我都会从快照中得到不一致的值。下面是我的数据库的样子:

以下是颤振代码,我用于获取特定 id 中的所有用户:

new FutureBuilder(
  future: db.child("Users").orderByChild("_id").equalTo("$userId").once(),
  builder: (context, AsyncSnapshot<DataSnapshot> snapshot) {
    if (snapshot.hasData){
      final values = snapshot.data!.value;
      print("values: "+values.toString());
      return Text("userName: " + values.toString());
    }
    return CircularProgressIndicator();
    }
  ),

values print 语句给出以下结果:

I/flutter (16745): values: [{phone: +880 (834) 473-3132, name: Luna Bray, _id: 615ec4d64259ae531dec9fcc}]
I/flutter (16745): values: {4: {phone: +880 (881) 491-2540, name: Sondra Paul, _id: 615ec4d6ee0c6d92626c1d55}}
I/flutter (16745): values: {3: {phone: +880 (973) 554-2796, name: Susan Walker, _id: 615ec4d60d00b15c0950e860}}
I/flutter (16745): values: {4: {phone: +880 (881) 491-2540, name: Sondra Paul, _id: 615ec4d6ee0c6d92626c1d55}}

从打印结果可以看出,只有第一个打印语句是List,其他都是Map。我需要快照中的值是列表或地图。我只需要与查询匹配的 id 的用户名。任何帮助表示赞赏。

【问题讨论】:

    标签: firebase flutter firebase-realtime-database


    【解决方案1】:

    您会看到 Firebase 的 SDK 和 REST API 在遇到顺序数字键时执行的数组强制结果。

    最好/最常见的解决方案是不使用连续的数字键,而是使用 Firebase 的内置 push() 操作为您生成键。有关为什么这是惯用的更多原因,请参阅此博客文章:Best Practices: Arrays in Firebase

    如果这不适合您,请在连续的数字键前面加上一个短字符串,例如“key0”、“key1”等。这样可以确保 SDK 无法将其转换为数组,并且为您提供一致的地图。

    【讨论】:

    • 感谢您的回复。我认为目前我们无法从 firebase 控制台编辑密钥,我必须导入 user.json 文件。 Firebase 导入将键命名为 0、1、2。
    • 那是因为你导入了一个数组(所以和你读键的时候一样,但是反过来)。但是,如果您希望能够在尝试时查询数据库中的结果,则必须确保键不会像我所描述的那样被强制转换为数组索引。
    • 嘿@KamrulHasanJony。这里有更新吗?
    • 我刚刚按照您的建议使用 key0、key1 更改了我的 json 数据。之后它工作了
    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多