【问题标题】:Firebase-Database inconsistence data being stored on database in AndroidFirebase-Database不一致数据存储在Android的数据库中
【发布时间】:2016-07-28 18:27:33
【问题描述】:

我是 Firebase 的新手。我正在尝试以给定格式将一些数据存储在 Firebase-database 中:

approot{
uid{
name:"name"
add:"add"
phn:"phn"
}
uid2{
name:"name"
add:"add"
phn:"phn"
}
.......

等等。 为此,我编写了以下代码:

String phn = inputPhn.getText().toString().trim();
        String add = inputAdd.getText().toString().trim();
        String name = inputName.getText().toString().trim();

        if (TextUtils.isEmpty(name)) {
            Toast.makeText(getApplicationContext(), "Enter name!", Toast.LENGTH_SHORT).show();
            return;
        }

        if (TextUtils.isEmpty(phn)||phn.length()!=10) {
            Toast.makeText(getApplicationContext(), "Enter phone no.!", Toast.LENGTH_SHORT).show();
            return;
        }

        if (TextUtils.isEmpty(add)) {
            Toast.makeText(getApplicationContext(), "Enter address!", Toast.LENGTH_SHORT).show();
            return;
        }
        //String info="Name:"+name+"\n"+"PhoneNo:"+phn+"\n"+"Adress:"+add+"\n";
        String uId=auth.getCurrentUser().getUid();
        myref.child(uId).child("name").setValue(name);
        myref.child(uId).child("add").setValue(add);
        myref.child(uId).child("phone").setValue(phn);
        myref.child(uId).child("end").setValue("end");
        auth.signOut();

我的问题是我在 firebase 数据库中的数据存储不一致。存储在数据库中的数据是这样的:

{
  "User" : {
    "ANj8GLEJS9alW11QYQyF8Rykwyn2" : {
      "add" : "hzjs",
      "name" : "hxjx"
    },
    "b0ZBftQ5UOOtTtzkeZHcC0558MC3" : {
      "add" : "gw",
      "name" : "hs"
    },
    "eH6rCXzvEncTe163N7KaJ7XEZp52" : {
      "name" : "dudj"
    },
    "gEqc92Z0mvcfIWvhZu7QOhRcnNQ2" : {
      "add" : "bsus",
      "name" : "jziz",
      "phone" : "1234567890"
    },
    "kGF2PalHrpeFus6682z55p47YBg2" : {
      "add" : "hdud",
      "name" : "jdhd"
    },
    "nHRt5n5roGfU3QogVUM09HDBrIw2" : {
      "add" : "qwerty",
      "end" : "end",
      "name" : "q",
      "phone" : "1234567860"
    },
    "pRRzexjQN1eynoCQcoClNl2TcHk2" : {
      "add" : "dvjh",
      "name" : "rhid"
    },
    "vaek3Z4eEVTWmc722T92tfgBwaE3" : {
      "add" : "dhudvj",
      "name" : "gsbud"
    },
    "xsH5JoTXftaxicUmvntt0N5hcNJ3" : {
      "add" : "zhs",
      "name" : "q"
    }
  }
}

请帮助我。
编辑
我正在使用 Firebase 9.2.1。 并且定义的规则是:-

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

【问题讨论】:

  • 要了解对setValue() 的调用失败的原因,请使用包含CompletionListener 的表单并检查DatabaseError 的值。我无法使用 9.2.1 版重现您的结果。你用的是什么版本?您是否为您的数据库设置了允许所有写入的安全规则?
  • @qbix 我已经编辑了问题和问题中添加的规则。
  • 您的uId 是自动生成的还是自定义的uId
  • 规则很好。添加 CompletionListeners 以了解对 setValue() 的调用失败的原因。

标签: android firebase firebase-realtime-database


【解决方案1】:

您应该等待setValue 完成后再注销用户,因为在成功调用signOut 后auth 将为空。如果setValue 还没有完成,这将违反您的规则,因为auth 已为空。

您可以使用CompletionListener 确保setValue 已完成,然后您可以安全地注销用户。像这样

Map<String, String> values = new HashMap<>();
values.put("name", name);
values.put("add", add);
values.put("phone", phn);
values.put("end", end);

DatabaseReference.CompletionListener completionListener = new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
        auth.signOut();
    }
};
myref.child(uid).setValue(values, completionListener);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多