2017-06-23 8 views
0

photoJsonが一意であるデータベースに画像情報をアップロードしたいとします。挿入する前に、データベースにすでに存在するかどうかを確認したい。だから私はこのルールを書きました。アプリ内で情報をアップロードすると、データを複製しています。私はこのような疑問が既に存在することを知っていますが、私は解決策を試してみました。firebaseルールでデータベースに同じデータが存在するかどうかチェック

{ 
"rules": { 
"wallpapers" :{ 
    ".read": true, 
    ".write" : true, 
    "$wallpaper":{ 
     "photoJson": { 
     //Checking if same wall already exists 
     ".validate": "!root.child('wallpapers').child(newData.val()).exists()", 
     }, 
     "url": { 
     ".validate": "newData.isString()" 
     }, 
     "thumbUrl": { 
     ".validate": "newData.isString()" 
     }, 
     "likes": { 
     ".validate": "newData.isNumber()" 
     }, 
     "dislikes": { 
     ".validate": "newData.isNumber()" 
     }, 
     "favorites": { 
     ".validate": "newData.isNumber()" 
     } 
     } 
    } 
} 
} 
+0

すでにノードのコレクション内に存在する特定の値のセキュリティルールでの方法はありません。例については、https://stackoverflow.com/q/35243492、https://stackoverflow.com/q/24820597、 –

+0

@FrankvanPuffelenを参照してください。次に、「.validate」とは何ですか?:!!root.child( 'wallpapers') .child(newData.val())。exists() "、"ステートメントは実際に行っていますか? –

+0

'newData.val()'という名前の子が 'wallpapers'の場所に存在するかどうかをチェックします。 –

答えて

0

解決策はアプリケーションのロジックであり、Firebaseのルールではありません。 Reference

ref.child("-JlvccKbEAyoLL9dc9_v").addListenerForSingleValueEvent(new 
    ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
      if (!snapshot.exists()) { 
       // TODO: handle the case where the data does not yet exist 
      } 
    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { } 
}); 
+0

これは、 '-JlvccKbEAyoLL9dc9_v'が' ref'の下にすでに存在するかどうかをチェックするだけです。 'push()'によって生成されたキーは統計的に一意であることが保証されているので、これをチェックする必要はありません。 –

関連する問題