2016-03-30 9 views
2

を削除します現在:Firebase再ログイン/追加のログインが持つデータのリストを保存するためにFirebase Androidのドキュメントを使用して、すべてのユーザーデータ

"rules": { 
    ".read": true, 
     "$posts": { 
     // create new post if it doesn't exist but can't modify or delete posts 
     ".write": "!data.exists() || newData.exists()" 
     } 
} 

問題は、ユーザーが再度ログインしたときに、すべての保存されたデータが消去されることですe).setValue(map)による。私はルールをカスケードダウンして読んだので、書き込みルールをできるだけ高くしようとしましたが、なぜ現在無視されているのか理解できませんか?

答えて

0

あなたの条件が間違っている:

!data.exists() || newData.exists() 

では、すでにデータが含まれている場所にデータを書き込むことを言います。これは、と評価されます。

!true || true => true 

おそらく探している:

!data.exists() 

またdocumentation on securing new data vs existing dataを参照してください。

+0

あなたのご入力いただきありがとうございます@フランクヴァンパフィーレン。あなたが示唆したように試みましたが、今は書き込みを許可していませんか?私が最初にリストした試みは、あなたが提供したドキュメンテーションのリンクから取られました。最後の見出し、「匿名チャットの例」を参照してください。コメント行によると、新しいメッセージの作成は許可されていますが、変更や削除はできません。 – JC23

+0

'!data.exists()&& newData.exists()' 'ドキュメントの例のスニペットは' && 'を使用していますが、' || ' –

+0

@frankvanpuffelenを謝ります。 : "!data.exists()&& newData.exists()" 'はテスト時にも書き込みを禁止しました?&&、| data.exists() !data.exists()は書き込みを防ぎますが、||はユーザーが再びログインするときにすべてを削除します。 – JC23

0

私が問題を正しく読んでいれば、問題はあなたのルールではあまりありませんが、ユーザーが以前に保存した情報が消去されることを認証するたびにその問題が解消されます。唯一のdisplayNameに置き換えること - それが事実であれば、私はあなたの推測、

ref.child("users").child(authData.getUid()).setValue(map); 

のsetValue()関数は、特定のユーザーのノードに行くと、他のすべてのデータをクリアしているとして、あなたの問題は、あると言うでしょう。

は、私はあなただけのユーザー名を更新し、所定の位置に残っているデータを残す必要があるのsetValueに反対updateChildren()メソッドを()

ref.child("users").child(authData.getUid()).updateChildren(map); 

たいと思います。

+0

@kyleの入力に感謝します初期のログインにこのメソッドを使用できることをドキュメントから認識しませんでした。ユーザーノード全体を削除しますが、updateChildrenは呼び出されたときにデータベースに書き換えます。 – JC23

関連する問題