如何在 Firebase 中设置允许写入 IF CHILD DOES NOT EXIST 的规则?
Posted
技术标签:
【中文标题】如何在 Firebase 中设置允许写入 IF CHILD DOES NOT EXIST 的规则?【英文标题】:how to set a rule in Firebase that allows writing IF CHILD DOES NOT EXIST? 【发布时间】:2021-12-28 11:49:27 【问题描述】:如果资源不存在,则无法设置允许写入子“NEWS”的规则。 (在应用程序中,我编写了一个代码,如果它不存在,则在 Firebase 中恢复“NEWS”子项)
我尝试了几个没有意义的操作。最后一个是:
"rules":
"NEWS":
".read": "auth.uid!==null",
".write": "auth.uid!==null &&
!data.parent().child('NEWS').exists()", // ! doesn't work
JAVA:阅读儿童“新闻”
REF_NEWS_FILM = FirebaseDatabase.getInstance().getReference().child(KEY_CHILD_NEWS).child(KEY_LANGUAGE).child(KEY_CHILD_NEWS_ABOUT_nameOfFilm);
ValueEventListener vel_news = new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
if (snapshot.getChildrenCount() == 0)
if (FirebaseAuth.getInstance().getCurrentUser() != null)
String newsDefault = getResources().getString(R.string.no_news_yet); // no news
MyStringClass newsDefaultClass = new MyStringClass(newsDefault);
REF_NEWS_FILM.push().setValue(newsDefaultClass);
else
Query queryNews = FirebaseDatabase.getInstance().getReference().child(KEY_CHILD_NEWS).child(KEY_LANGUAGE).child(KEY_CHILD_NEWS_ABOUT_nameOfFilm).orderByChild("text");
queryNews.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
for (DataSnapshot dss : snapshot.getChildren())
MyStringClass newsClass = dss.getValue(MyStringClass.class);
assert newsClass != null;
String newsString = newsClass.getText();
TV_NEWS_ABOUT_FILM.setText(newsString);
@Override
public void onCancelled(@NonNull DatabaseError error)
throw databaseError.toException(); // advice from Frank
);
@Override
public void onCancelled(@NonNull DatabaseError error)
throw databaseError.toException(); // advice from Frank
;
REF_NEWS_FILM.addValueEventListener(vel_news);
【问题讨论】:
安全规则只有在被代码执行后才有意义。您能否编辑您的问题以显示根据这些规则重现问题的最少代码? 1) 请不要忽略错误。至少onCancelled
应该是public void onCancelled(@NonNull DatabaseError databaseError) throw databaseError.toException();
,这也可以让你看到你的哪些操作失败了。 2) 由于您的规则要求允许读取 auth.uid!==null
,因此请确保在您的代码中通过将 if (FirebaseAuth.getInstance().getCurrentUser() != null
放在您共享的代码周围来满足此条件。
好的。谢谢弗兰克先生。我将修复代码并再次发布(为其他人)
【参考方案1】:
你应该可以使用!data.exists()
:
"rules":
"NEWS":
".read": "auth.uid!==null",
".write": "auth.uid!==null && !data.exists()"
为防止将null
写入其中,您可能应该扩展为还检查newData.exists()
:
"rules":
"NEWS":
".read": "auth.uid!==null",
".write": "auth.uid!==null && newData.exists() && !data.exists()"
【讨论】:
感谢您的回答,但它不起作用。 (在 PlayGround 中测试显示错误)以上是关于如何在 Firebase 中设置允许写入 IF CHILD DOES NOT EXIST 的规则?的主要内容,如果未能解决你的问题,请参考以下文章
用户扫描二维码以读取和写入特定数据库节点后如何在 Firebase 中设置安全规则
无法在 android studio 中设置 firebase
如何在 Flutter 中设置不同的 firebase 环境