如何避免Firebase中的冗余

时间:2018-07-25 12:28:31

标签: typescript firebase firebase-realtime-database google-cloud-firestore

是否有可能避免Firebase数据库中的冗余?

我有一个应用程序,用户可以在其中添加第一个单词和第二个单词。使用按钮,您可以获取两个单词中的一个随机单词。

 Random rand = new Random();
            int n = rand.nextInt(9);

            Random rand1 = new Random();
            int m = rand1.nextInt(8);

            String first = sp.getItemAtPosition(n).toString();
            String second = sp2.getItemAtPosition(m).toString();

            out.setText(first + second);

所以我从微调框(Spinner)中得到了文字(请不要问为什么这样做)

现在好。如何检查随机选择的单词是否已在数据库中?

使用if-else指令吗?

结构如下:

{"1stWord" : {
"1stWord" : {
  "-LI125GLPy0-IPAm4GEM" : {
    "name" : "test"
  },

先谢谢大家!

3 个答案:

答案 0 :(得分:1)

您需要使用查询来检查数据库中是否存在该值:

ref.child("Words").orderByChild("randomWord1").equalTo(second).addListenerForSingleValueEvent(new ValueEventListener() {           
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
         if(dataSnapshot.exists()){
               //it exists
         }
     }

    @Override
   public void onCancelled(DatabaseError databaseError) {
  }
});

假设您有此数据库:

Words
 randomId
   randomWord1: "words"

因此,您在此处使用orderByChild()检查此子项是否等于随机词。然后,您使用dataSnapshot.exists()检查要检索的数据是否存在于数据库中。

答案 1 :(得分:1)

Firebase有其自己的唯一ID作为默认值,我认为这是最好的方法,因为firebase实际上进行检查和分配,因此可以减少代码数量。所以我建议就这样离开。在文档级别设置唯一ID。

答案 2 :(得分:1)

如果要确保某个值在数据库中是唯一的,则使用该值作为节点内键的最简单方法。因此,如果您的单词要唯一,请创建一个节点words,并在该节点下将每个单词存储为具有true伪值的关键字。例如。

"words": { 
  "avoid": true, 
  "redundance": true 
}

由于键在集合中按定义是唯一的,因此可以自动确保满足您的要求。

要在此集合中写一个新词,您将使用一个事务:

DatabaseReference wordRef = FirebaseDatabase.getInstance().getReference("words/avoid");
wordRef.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        String word = mutableData.getValue(String.class);
        if (word == null) {
            mutableData.setValue("avoid");
            return Transaction.success(mutableData);
        }
    }

    @Override
    public void onComplete(DatabaseError databaseError, boolean b,
                           DataSnapshot dataSnapshot) {
        // Transaction completed
        Log.d(TAG, "writeWord completed: " + databaseError);
    }
});

另请参阅以下一些答案: