我有一个小问题,使用.push()将数据存储在key下而不替换childs

时间:2017-03-21 08:16:06

标签: android firebase firebase-realtime-database

所以我正在尝试生成一个新的按键并在每个按钮点击下保存它下面的2个孩子...但是,每次我提交请求时它要么替换密钥要么不改变任何东西如果输入的数据在我的编辑文本中与最初输入的文本相同是我的代码。

DatabaseReference reference = FirebaseDatabase.getInstance().getReference().push();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    tvStoreName = (TextView) findViewById(R.id.tvStoreName);
    tvStoreName.setText(getIntent().getExtras().getString("Email"));
    etDestination= (EditText) findViewById(R.id.etDestination);
    bAddNew = (Button) findViewById(R.id.bAddNew);


    bAddNew.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){

            Toast.makeText(Home.this, "Request Sent", Toast.LENGTH_LONG).show();


            String value1 = tvStoreName.getText().toString();

            String value3 = etDestination.getText().toString();

            reference.child("StoreEmail").setValue(value1);
            reference.child("Destination").setValue(value3);
        }
    });

    }}

4 个答案:

答案 0 :(得分:0)

  

每次我提交请求时,它都会替换密钥或不会更改任何内容

这是对的。

因为您正在使用:

reference.child("StoreEmail").setValue(value1);

您可以查看official doc:

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

如果您想更新数据,则必须使用updateChildren()方法。

答案 1 :(得分:0)

您必须在DatabaseReference上调用push().getKey()才能获取密钥。如果要在不同位置的同一个按键下保存两个数据,以下代码将执行此操作。但是,当您在多个位置更新数据时,始终建议do that in one call使用updateChildren()方法。

DatabaseReference reference = FirebaseDatabase.getInstance().getReference().push();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    tvStoreName = (TextView) findViewById(R.id.tvStoreName);
    tvStoreName.setText(getIntent().getExtras().getString("Email"));
    etDestination= (EditText) findViewById(R.id.etDestination);
    bAddNew = (Button) findViewById(R.id.bAddNew);


    bAddNew.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){

            Toast.makeText(Home.this, "Request Sent", Toast.LENGTH_LONG).show();


            String value1 = tvStoreName.getText().toString();

            String value3 = etDestination.getText().toString();

            String key = reference.push().getKey();
            reference.child("StoreEmail").child(key).setValue(value1);
            reference.child("Destination").child(key).setValue(value3);
        }
    });

    }}

答案 2 :(得分:0)

长话短说

如果您想将value1设置为此路径your-db-name\StoreEmail,那么您应该像这样更改引用init:

DatabaseReference reference = FirebaseDatabase.getInstance().getReference();

希望这有帮助

说明

我只是意识到reference对象是...push()方法的结果。这使你每次写作

reference.setValue(yourValueHere);

执行:

FirebaseDatabase.getInstance().getReference().push().setValue(yourValueHere);

请注意,getReference().push()会在您的数据库中创建一个新的随机子uid(例如your-db-name/-K83298jsdal。所以它会生成您的代码,如下所示:

reference.child("StoreEmail").setValue(value1);

实际上会在value1

保存新值(your-db-name/-K83298jsdal/StoreEmail

答案 3 :(得分:0)

我能够让它上班!!这个问题是因为我没有包含这个问题而引起的。

             finish();
            startActivity(getIntent());

到我的OnClickListener的底部,但我不得不说你们真棒!