斯威夫特& Firebase - 从帖子中删除主题标签

时间:2017-09-29 09:17:54

标签: ios firebase firebase-realtime-database hashtag swift4

我正在尝试编写该功能以删除我的应用中的帖子。当我删除帖子时,我想删除与该帖子相关的所有标签。 我使用Firebase,不是很长时间,我真的不知道该怎么做:/

这是我的数据库: enter image description here

我有每个“hashtags”和孩子,相关的帖子。

当我删除帖子时,我想删除与标签相关联的子项。

这是我未完成的代码:

func deleteHashtagsFromPost(withPost id: String) {
      Database.database().reference().child("hashtag").observe(.value) { (snapshot) in
         if let dict = snapshot.value as? [String: Any] {

            for hashtag in dict {
               // Here I can access to the hashtag with hashtag.key
               // And also to the children associated with hashtag.value
            }
         }
      }
   }

这是我的数据库中“帖子”的见解:

enter image description here

2 个答案:

答案 0 :(得分:0)

在Firebase基于的NoSQL数据库中,最佳做法是复制对象。

您的代码最初属于相关的帖子,因此请将它们放在此处。可以很容易地在应用中显示它们,因为它们位于您检索的对象中。您可能还希望根据标签搜索帖子,因此您可以像创建标签一样创建标签分支,这样您就可以获得所有相关帖子,而无需在每个帖子中搜索标签。

这似乎是多余的,但这就是它在noSQL中的工作方式,如果你想要更好的结果,你必须为你的数据处理多个位置。

您可能知道,但如果您的数据模型有很多关系,那么最好去一个SQL数据库。 (你的模型不是很多,所以没关系)

  

Vive la baguette!

答案 1 :(得分:0)

这里的问题是你的帖子里面没有存储主题标签。因此,为了删除它们,您必须遍历整个hashtag分支,而您不希望在客户端执行该分支。我将主题标签存储在post对象中。然后这样做

let hashtags = [String]() // put all the posts hashtags in here
let postKey = post.key // key for the post you just deleted

for i in 0..<hashtags.count {
    deleteHashtagsFromPost(postKey: postKey, hashtagUsedInPost: hashtags[i])
}

func deleteHashtagsFromPost(postKey: String, hashtagUsedInPost: String) {
    Database.database().reference.child("hashtag").child(hashtagUsedInPost).child(postKey).removeValue()
    // you can add a completion block if you wish
}

如果您对使用Firebase云功能感兴趣,可能会看起来像这样:

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

// so we can write to the database in functions outside of the database triggers
var db = admin.database();

exports.deleteHastags = functions.database.ref('/posts/{postid}').onDelete(event => { 

  console.log("Post was deleted");
  const key = event.data.previous.key;
  const post = event.data.previous.val();
  const hashtags = event.data.previous.val().hashtags; // requires that the hashtags are stored with the post in FB DB
  removeHashtags(hashtags, key);
  return;
});

function removeHashtags(hashtags, key) {
    for (var hashtag in hashtags) {
        db.ref("hashtag").child(hashtag).child(key).remove();
    }
}

Firebase Database Triggers