Firebase更新数组值或创建新数组

时间:2017-10-14 08:19:32

标签: ios arrays swift firebase

我试图更新firebase中的数组。 我知道我可以添加这样的新数组:

let array1 : [String] = ["w9pRe7sTj5aUPf3og4vUZ3kVpXs2"]
firebaseRef.child(playerID).child("friends").setValue(array1)

但是如果用户已经拥有"朋友"的数组,则会使用新数据覆盖旧数据。

仅当用户没有"朋友"的数组时,我才能创建新数组。 如果数组存在,只需"追加"新价值。

由于

3 个答案:

答案 0 :(得分:0)

您可以采取两种方法。

选项1: 将当前数组转换为可变数组,向其添加对象并再次设置值

NSMutableArray * mutableArray = [NSMutableArray arrayWithArray:firebaseArray];
[mutableArray addObject:@"random_id"];
firebaseRef.child(playerID).child("friends").setValue([mutableArray copy]);

注意:这也可以调用观察者的childAdded:方法来预先存在id。

选项2:将数组转换为set。这是您的首选方法,因为您不希望“朋友”列表中有多个类似的字符串。它也很容易维护。

firebaseRef.child(playerID).child("friends").child("random_id").setValue(YES);

答案 1 :(得分:0)

而不是像这样使用:

  

以这种方式使用setValue会覆盖指定位置的数据,包括任何子节点。

let src = "https://www.foobar.com/page?year=all&language=all&gender=female";
let url = new URL(src);
let re = /all/;
let props = [...new URLSearchParams(url.search)]
            .filter(([key, prop]) => !re.test(prop));
url = url.origin + url.pathname;
let params = new URLSearchParams();
props.forEach(([key, prop]) => params.set(key, prop));
url += "?" + params.toString();

console.log(url);

您可以尝试以下方式:

  

...您仍然可以在不重写整个对象的情况下更新孩子。如果您想允许用户更新其个人资料,您可以按如下方式更新用户名:

self.ref.child("users").child(user.uid).setValue(["username": username])

我希望这可以帮到你。

documentation

答案 2 :(得分:0)

我认为没有办法去追加"没有覆盖的数组中的新值存在具有新数组的数组。

请查看此示例:

firebaseRef.child(playerID).child("friends").observeSingleEvent(of: .value) { (snapshot) in
    // check if friends array exist
    if let friendsArr = snapshot.value as? NSArray{
        // add new friend ID to the array
        let newArr = friendsArr.adding("YOUR NEW FRIEND ID")
        // update in firebase DB
        snapshot.ref.setValue(newArr)
    }else{ // No array exist, save new array
        firebaseRef.child(playerID).child("friends").setValue(array1)
    }
}