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>{
"items" : [ {
"description" : "fuzzy socks",
"type" : "toy"
}, {
"description" : "bouncy ball",
"type" : "toy"
}, {
"description" : "scrabble",
"type" : "game"
}, {
"description" : "construction paper",
"type" : "crafts"
} ],
"users" : [ {
"itemList" : [ 1, 2, 3, 4 ],
"description" : "brown",
}, {
"itemList" : [ 5, 6, 7 ],
"description" : "green",
}, {
"itemList" : [ 8, 9, 10 ],
"description" : "blue",
}, {
"itemList" : [ 11, 12, 13 ],
"description" : "yellow",
} ]
}
</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: "Bud"
selected: false
uid_1
name: "Henry"
selected: false
uid_2
name: "Billy"
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("users")
</code></pre>
<p>我们通过遍历数组来构建这些 ref 并将 selected 设置为 true,从而知道我们想要的 100 个用户的路径</p>
<pre><code>for uid in uidArray {
let thisUserRef = usersRef.childByAppendingPath(uid)
let selectedRef = thisUserRef.childByAppendingPath("selected")
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]