菜鸟教程小白 发表于 2022-12-12 19:45:38

ios - 如何从 Firebase 获取一组对象?


                                            <p><p>在我的 React-Native 应用程序中,我有一组特定用户,我想从 Firebase 中提取他们的值。解决此问题的最有效方法是什么?目前我正在遍历数组并为每个数组发出一个新请求(下面的相关代码):</p>

<pre><code>const usersRef = new Firebase(`${ config.FIREBASE_ROOT }/users`)

for (var key in usersArray) {
   var userRef = usersRef.child(key);
   //do stuff here
}
</code></pre>

<p>但是,我觉得这不是很有效,它会向数据库发出多个请求。有没有一种方法可以在一次调用中传入数组并从 Firebase 获取这些项目?谢谢。</p>

<p>Firebase 数据结构:</p>

<pre><code>{
&#34;items&#34; : [ {
    &#34;description&#34; : &#34;fuzzy socks&#34;,
    &#34;type&#34; : &#34;toy&#34;
}, {
    &#34;description&#34; : &#34;bouncy ball&#34;,
    &#34;type&#34; : &#34;toy&#34;
}, {
    &#34;description&#34; : &#34;scrabble&#34;,
    &#34;type&#34; : &#34;game&#34;
}, {
    &#34;description&#34; : &#34;construction paper&#34;,
    &#34;type&#34; : &#34;crafts&#34;
} ],
&#34;users&#34; : [ {
    &#34;itemList&#34; : [ 1, 2, 3, 4 ],
    &#34;description&#34; : &#34;brown&#34;,
}, {
    &#34;itemList&#34; : [ 5, 6, 7 ],
    &#34;description&#34; : &#34;green&#34;,
}, {
    &#34;itemList&#34; : [ 8, 9, 10 ],
    &#34;description&#34; : &#34;blue&#34;,
}, {
    &#34;itemList&#34; : [ 11, 12, 13 ],
    &#34;description&#34; : &#34;yellow&#34;,
} ]
}
</code></pre>

<p>简化用例:在一个用例中,我只想获取有关 2 个用户的信息(在我存储在 Firebase 中的所有用户中——假设它不仅仅是上面结构中的 4 个)。所以,我有数组 <code>importantUsers</code>:</p>

<pre><code>var importantUsers =
</code></pre>

<p>然后,我想向 Firebase 发送一个请求,该请求仅在数据库中查询与这些 userID 值关联的值(因此以某种方式将数组传递给 Firebase 以获得结果)。返回值是这样的:</p>

<pre><code>0: itemList: , description: brown
3: itemList: , description: yellow
</code></pre>

<p>我一次查询多个用户的数据库(而不是为用户 0 和用户 3 创建单独的引用)的动机是不要多次调用 Firebase。有没有办法解决这个问题?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>所以你所追求的是一个 sql 'in' 类型的查询。在 中选择。从列表中选择多个用户。</p>

<p>您问题中的另一个挑战是您感兴趣的用户是随机的,因此您不能使用 .startAt 和 .endAt,并且用户之间没有其他关系。</p>

<p>Firebase 不直接支持“in”、“and”或“or”类型的查询,但有多种方法可以实现。</p>

<p>怎么样:标记你想要的用户,然后用一个查询,读入他们。</p>

<p>首先,您将从一个典型的 Firebase/users 节点开始,并添加一个“选定”子节点(最初可以省略,但我在这里将其显示为占位符)</p>

<pre><code>users
uid_0
   name: &#34;Bud&#34;
   selected: false
uid_1
   name: &#34;Henry&#34;
   selected: false
uid_2
   name: &#34;Billy&#34;
   selected: false
</code></pre>

<p>然后,我们需要一些随机的 uid,比如 uid_0 和 uid_2,并将它们存储在一个数组中。请记住,我们将使用 Firebase 生成的 uid,但为了简单起见,我们将使用 uid_0、uid_1 等。</p>

<p>只有两个用户,您可以在两个节点上分别观察SingleEventOfType,没什么大不了的。</p>

<p>但是,如果我们需要 100 个随机用户或 1000 个用户,则应避免执行 1000 个单独的查询或observeSingleEvent。但是,setValue 非常快(没有返回数据)所以....</p>

<p>获取我们的用户引用</p>

<pre><code>let usersRef = myRootRef.ChildbyAppendingPath(&#34;users&#34;)
</code></pre>

<p>我们通过遍历数组来构建这些 ref 并将 selected 设置为 true,从而知道我们想要的 100 个用户的路径</p>

<pre><code>for uid in uidArray {
let thisUserRef = usersRef.childByAppendingPath(uid)
let selectedRef = thisUserRef.childByAppendingPath(&#34;selected&#34;)
selectedRef.setValue(true)
}
</code></pre>

<p>然后,您可以在 usersRef 中查询选定的 child = true 的所有用户。</p>

<p>一旦你有了它们,清理,迭代返回的用户并将 selected 设置为 false 或 nil</p>

<p>这很酷的一点是,setValue 可以非常快速地通过 100 或 1000 个用户而没有开销,将他们选择的 child 设置为 true。然后一个查询就可以返回你想要的值。</p>

<p>写出然后读回的逻辑似乎几乎是相反的,但我很确定这比遍历数组并生成 1000 个查询或观察者要好得多。</p>

<p>(Firebase 的人可以检查我的那个)</p>

<p>另一个想法是,如果用户说,单击列表中的其他用户,您可以在他们单击时设置 selected = true,然后在用户完成时查询这些用户。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何从 Firebase 获取一组对象?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37053906/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37053906/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何从 Firebase 获取一组对象?