Firebase 更新与设置

Posted

技术标签:

【中文标题】Firebase 更新与设置【英文标题】:Firebase update vs set 【发布时间】:2016-12-19 19:16:32 【问题描述】:

正如标题所说,我无法理解updateset 之间的区别。文档也帮不了我,因为如果我改用 set,更新示例的工作原理完全相同。

文档中的update 示例:

function writeNewPost(uid, username, title, body) 

    var postData = 
        author: username,
        uid: uid,
        body: body,
        title: title,
        starCount: 0
    ;

    var newPostKey = firebase.database().ref().child('posts').push().key;

    var updates = ;
    updates['/posts/' + newPostKey] = postData;
    updates['/user-posts/' + uid + '/' + newPostKey] = postData;

    return firebase.database().ref().update(updates);

同样的例子使用set

function writeNewPost(uid, username, title, body) 

    var postData = 
        author: username,
        uid: uid,
        body: body,
        title: title,
        starCount: 0
    ;

    var newPostKey = firebase.database().ref().child('posts').push().key;

    firebase.database().ref().child('/posts/' + newPostKey).set(postData);
    firebase.database().ref().child('/user-posts/' + uid + '/' + newPostKey).set(postData);

所以也许应该更新文档中的示例,因为现在看起来 updateset 做了完全相同的事情。

亲切的问候, 福利

【问题讨论】:

【参考方案1】:

原子性

您提供的两个示例之间的一大区别在于它们发送到 Firebase 服务器的写入操作数量。

在第一种情况下,您发送的是单个 update() 命令。整个命令要么成功,要么失败。例如:如果用户有/user-posts/' + uid的发帖权限,但没有/posts的发帖权限,则整个操作会失败。

在第二种情况下,您要发送两个单独的命令。使用相同的权限,现在写入/user-posts/' + uid 将成功,而写入/posts 将失败。

部分更新与完全覆盖

在此示例中,另一个区别不是立即可见的。但假设您正在更新现有帖子的标题和正文,而不是写新帖子。

如果您使用此代码:

firebase.database().ref().child('/posts/' + newPostKey)
        .set( title: "New title", body: "This is the new body" );

您将替换整个现有帖子。所以原来的uidauthorstarCount 字段将会消失,而只会有新的titlebody

另一方面,如果您使用更新:

firebase.database().ref().child('/posts/' + newPostKey)
        .update( title: "New title", body: "This is the new body" );

执行此代码后,原始的uidauthorstarCount 以及更新后的titlebody 仍然存在。

【讨论】:

非常感谢您的回答。也许用更新方法的更清晰示例来更新文档是个好主意。 @frank-van-puffelen 听起来update() 是可以做到这一切的goto 主力。您甚至可以将update 属性设置为null... 有效地完成remove 的相同工作。那么,有什么真正好的理由使用set() 吗?如果您想对数据进行一些认真的修剪/重塑? 文档当然需要改进,以便以清晰的方式添加此答案中的信息。 update 是否也适用于创建新数据字段@Frank? 是的。试一试,如果您在使其适用于您的案例时遇到问题,请提出一个新问题。

以上是关于Firebase 更新与设置的主要内容,如果未能解决你的问题,请参考以下文章

Firebase iOS Swift - 将 Atname 更新功能添加到设置

Firebase 用户设置电话号码

Firebase与数据更新滞后 - 多人游戏

Firebase iOS 设置优先级不更新查询

Firebase 实时数据库安全规则允许更新但未设置

如何设置计时器以更新firebase数据库中的数据