如何避免覆盖firebase中的数据

时间:2016-05-31 15:30:31

标签: android firebase firebase-realtime-database

这是我在Firebase中添加记录的代码。外面的变量名为restauCount,值为(int)为1

public void sendMessage(){

    int restauCount = 1;
    String identifier ="Restaurant" + restauCount;
    Firebase userRef = firebaseRef.child("Caloocan");
    EditText nameInput = (EditText) findViewById(R.id.nameTxt);
    String name = nameInput.getText().toString();

    EditText locInput = (EditText) findViewById(R.id.locationTxt);
    String location = locInput.getText().toString();

    EditText typeInput = (EditText) findViewById(R.id.typeTxt);
    String foodtype = typeInput.getText().toString();
    if (!name.equals("")){
        Map<String, String> caloocan = new HashMap<String, String>();
        caloocan.put("resname", name);
        caloocan.put("resloc", location);
        caloocan.put("foodtype", foodtype);

        Map<String, Map<String, String>> users = new HashMap<String, Map<String, String>>();
        users.put(identifier,caloocan);

        userRef.setValue(users);
        restauCount++;
    }
}

当我再次运行sendessage()时。我将输入字段,当我点击ADD这是sendMessage时,它将被添加到FireBase中,但是当我添加新数据时。它覆盖了旧数据的输入?如何在没有覆盖数据的情况下在火灾中添加多个数据? 创建restauCount是为了增加我输入的餐厅数量

4 个答案:

答案 0 :(得分:2)

userRef.push().setValue(users); 每次将新子项添加到指定的Firebase引用

时,push()方法都会生成唯一键

答案 1 :(得分:1)

使用

userRef.setValue(users).push();

而不是userRef.setValue(users);

答案 2 :(得分:1)

您始终使用相同参考

String identifier ="Restaurant" + restauCount;
Firebase userRef = firebaseRef.child("Caloocan");
userRef.setValue(users);
restauCount++;

Check the doc

  

以这种方式使用setValue()会覆盖指定位置的数据,包括任何子节点。

在您的情况下,由于这个原因,您会覆盖相同的数据

每次将新子项添加到指定的Firebase参考时,您都应使用push()方法生成唯一ID。

Firebase userRef = firebaseRef.child("Caloocan");
Firebase newRef =  userRef.push();
newRef.setValue(users);

//to get the key
String key = newRef.getKey();

答案 3 :(得分:0)

您需要更新identifier它保持不变:

int restauCount = 1;
String identifier ="Restaurant" + restauCount;

尝试类似:

    long restauCount = System.currentTimeMillis();
    String identifier ="Restaurant" + restauCount;

这里每次发送sendMessage()时你的标识符都有一个特定的id作为当前时间,以毫秒为单位+“餐馆”

如果保持int号码很重要,请告诉我