【问题标题】:How to avoid redundance in Firebase如何避免 Firebase 中的冗余
【发布时间】:2019-01-02 06:34:50
【问题描述】:

是否有可能避免 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"
  },

提前谢谢各位!

【问题讨论】:

  • 你能告诉我们你的数据库结构吗?

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


【解决方案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() 检查您尝试检索的数据是否存在于数据库中。

【讨论】:

  • 感谢您的回复。什么是“等于(秒)”?那么什么是第二?我在顶部的问题中添加了数据库结构。
  • 这是第二个 String second = sp2.getItemAtPosition(m).toString(); 你将它添加到 equalTo 中以检查该字符串是否在数据库中 @Hansi
  • 好的。但在这种情况下,第二个字符串只是一个随机单词(随机字母,因为“m”)。但是如何检查 out String (String out = first + second;) 是否在数据库中?甚至可以用那个时间戳检查它吗?
  • 是的,您问“我如何检查随机选择的单词是否已经在数据库中?”。这就是答案,如果让我们说单词是“house”,那么如果您执行 orderByChild("randomWord1").equalTo("house") 它将检查“house”是否在数据库中,然后它将检查数据库中是否已存在此数据快照@Hansi
  • 使用.addValueEventListener(new ValueEventListener(){ 而不是.addListenerForSingleValueEvent(new ValueEventListener() {
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果要确保某个值在数据库中是唯一的,最简单的方法是使用该值作为节点内的键。因此,如果您的单词要唯一,请创建一个节点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);
        }
    });
    

    另请参阅之前的一些答案:

    【讨论】:

      猜你喜欢
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      相关资源
      最近更新 更多