查询等于true的值

时间:2016-10-28 16:38:57

标签: swift firebase firebase-realtime-database

我想制作一些简单的成就系统。最好的方法是什么?现在我喜欢这个来查询成就,但像这样我不能有像青铜等徽章类型:

databaseRef.child("usersAchievements").child(currentUser.generalDetails.uid).observe(.childAdded, with: { (snapshot) in


            if snapshot.value as? Int == 1{
                self.achievements.append(snapshot.key)
            }
            self.tableView.reloadData()

        }){ (error) in

        }

但是我不认为这是最好的方法,因为我想在tableview中显示像青铜或黄金这样的价值,但是现在它是不可能的,因为我无法找到我应该如何构建它。

可以使用这样的JSON结构:

allAchievements
 achievement1: 0 //e.g 0 is bronze and 1 is silver
 achievement2: 1


usersAchievements
  uFC7QFuY5rTUzxnXYlClrKobaQP2 //UID
     achievement1
       type: gold 
       username: true
     achievement2
       username: true
       type: silver

或者像这样拥有JSON更好:

allAchievements
 achievement1: 0
 achievement2: 0


usersAchievements
  uFC7QFuY5rTUzxnXYlClrKobaQP2 //UID
     achievement1: true
     achievement2: true

我似乎无法找到合适的答案。

我希望在tableview中看到类似的成就,棕色点是青铜色,金色或银色:

enter image description here

2 个答案:

答案 0 :(得分:1)

我建议使用第二个选项,因为它使您的树更简单。就个人而言,我会进一步折射它。

首先,我将摆脱allAchievements节点。这似乎相当多余。除非您计划向用户展示所有可用的不同成就,否则我只是将其删除。另外,作为用户,当我将 bronze 视为成就之一时,我会自动假设他们的 gold < / em>或类似的东西。但即使作为开发人员,您也知道所有级别,因此您只需将其列出即可。总而言之,我会摆脱节点。

其次,我将构建成就,而不是

usersAchievements
uFC7QFuY5rTUzxnXYlClrKobaQP2
bronze: true
silver: true

想要更新时会发生什么?两种方式

  1. 对于创建的每个新UUID,您可以默认创建所有成就节点,并为其指定值false。解锁成就后,您只需更新相应的值。

    usersAchievements
    uFC7QFuY5rTUzxnXYlClrKobaQP2
    bronze: true // user earned this so its true
    silver: false // not earned so false but node already exists
    gold: false // not earned so false but node already exists
    
  2. 仅在获得的基础上创建新成就。

    usersAchievements
    uFC7QFuY5rTUzxnXYlClrKobaQP2
    bronze: true // only one earned by the user
    
  3. 第一个选项很好,因为您只需更新每个成就节点。但是我认为你可以看到当你有很多不同的成就时会有多么可怕/复杂。您将拥有大量与用户无关的数据。

    另一方面,第二个选项保证信息与特定用户相关,但您必须跟踪创建选项。

    PS 如果您选择使用第二个选项,则应该在节点为空时处理;用户尚未在客户端获得任何成就

答案 1 :(得分:1)

如果您的成就是动态的,请将它们存储在一个节点中,并在其上保留一个观察者,这样如果添加了一个新的,则会通知所有客户端。您将使用它来填充代码中的字典(例如achievementDict)以用作查找。

achievement_list
   -Uom9a9smmpasdm
       name: "Bronze"
   -Jiaiisiask9jkm
       name: "Silver"
   -Ykmsimiaooooos
       name: "Gold"
   -IJij00mlso09m9
       name: "Supa Dupa"

然后为您的用户,在其用户节点中保留对其成就的引用

users
   -Yiniasopksdpok
      user_name: "Leroy Brown"
      achievements:
         -Ykmsimiaooooos: true
         -IJij00mlso09m9: true
   -JYimpoaosmoso
      user_name: "Marco Polo"
          achievements:
         -Uom9a9smmpasdm: true

有了这个,你知道Leroy有金牌,Supa Dupa和Marco Polo是银牌。

您想要使用成就的实际名称&#34; Bronze&#34;,&#34; Silver&#34;等等,这些都保存在您的应用程序的字典中,如果添加了新的成就,则会更新。

当您的用户列表(或其他)显示时,您可以通过该键从该词典中查找每个成就。

let achievementName = achievementDict["-IJij00mlso09m9"]

将取回Supa Dupa