Java 如何在Firebase-Android中向现有列表添加值

Java 如何在Firebase-Android中向现有列表添加值,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我想从Firebase中将另一项添加到“oreSelectate”列表中,但我不知道如何添加。我想从应用程序中选择另一个每小时间隔,并将其添加到“oreSelectate”列表中 这是我的应用程序 这是我的Firebase实时数据库中的内容 我试过3种方法: setValue()-它不起作用,因为它将覆盖现有数据 我尝试将firebase数据加载到一个列表中,然后将firebase列表复制到另一个列表中,将新数据添加到第二个列表中,然后将该列表添加到子“oreSelectate”中,但问题是它保

我想从Firebase中将另一项添加到“oreSelectate”列表中,但我不知道如何添加。我想从应用程序中选择另一个每小时间隔,并将其添加到“oreSelectate”列表中

这是我的应用程序

这是我的Firebase实时数据库中的内容

我试过3种方法:

  • setValue()-它不起作用,因为它将覆盖现有数据
  • 我尝试将firebase数据加载到一个列表中,然后将firebase列表复制到另一个列表中,将新数据添加到第二个列表中,然后将该列表添加到子“oreSelectate”中,但问题是它保留了旧数据,并将新数据像这样放置
  • 在将旧数据加载到列表中后,我尝试从firebase中删除它,但仍然不起作用
  • 有什么问题吗?我将在下面留下我的代码:

    btn_inchiriaza.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    getOreFromFirebase(new OreListCallback() {
                        @Override
                        public void onCallback(List<String> value) {
                            ore_ocupate.clear();
                            ore_ocupate = value;
                            int len = lv_ore.getCount();
                            SparseBooleanArray checked = lv_ore.getCheckedItemPositions();
                            for(int i = 0; i < len ; i++){
                                if(checked.get(i)){
                                    ore_ocupate.add((String) oreAdapter.getItem(i));
                                }
                            }
                            reff.child("TerenuriFotbal").child("Sector " + cifra_sector).child(nume_teren_extra).child("oreSelectate").setValue(ore_ocupate);
                            lv_ore.clearChoices();
                            oreAdapter.notifyDataSetChanged();
    
                            Toast.makeText(view.getContext(), "Ati rezervat cu succes!", Toast.LENGTH_LONG).show();
                            Intent intent = new Intent(InchiriazaTeren.this, MainActivity2.class);
                            startActivity(intent);
                        }
                    });
                }
            });
    
    btn_inchiriaza.setOnClickListener(新视图.OnClickListener()){
    @凌驾
    公共void onClick(视图){
    getOreFromFirebase(新的OreListCallback(){
    @凌驾
    公用void onCallback(列表值){
    矿石透明;
    矿石含量=价值;
    int len=lv_ore.getCount();
    SparseBooleanArray checked=lv_ore.getCheckedItemPositions();
    对于(int i=0;i
    公共接口或列表回调{
    void onCallback(列表值);
    }
    public void getOreFromFirebase(最终OreListCallback myCallback){
    reff.child(“TerenuriFotbal”).child(“扇区”+cifra_扇区).child(nume_teren_extra).child(“oreSelectate”).AddListener for SingleValueEvent(新值EventListener(){
    @凌驾
    public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
    对于(DataSnapshot DataSnapshot:snapshot.getChildren()){
    字符串ora=(字符串)dataSnapshot.getValue();
    断言ora!=null;
    ore_ocupate_baza_de_日期。添加(ora);
    }
    myCallback.onCallback(ore_ocupate_baza_de_日期);
    }
    @凌驾
    已取消公共void(@NonNull DatabaseError){
    }
    });
    }
    

    谢谢

    Firebase数据库使用原语和字符串类型作为值。这意味着您的列表始终是一个字符串。向这种形式的列表中添加某些信息的唯一方法是将其作为字符串,使用ValueEventListener,然后添加类似于列表中的值

    CloudFireStore更适合存储不同类型的对象。 在Firestore中,您可以选择:

    数字、布尔值、字符串、地图、地理点、数组、时间戳,甚至对其他值的引用

    这允许您执行操作


    正如我在您的屏幕截图中看到的,您的“oreSelectate”属性是数组类型。不像在中,使用数组更容易,在实时数据库中,有一些限制。许多开发人员不使用数组的原因之一是,它使安全规则难以编写。在这种情况下,更好的方法是按如下方式对数据库进行建模:

    Firebase-root
      |
      --- TerenuriFotbal
            |
            --- Sector 3
                  |
                  --- Asii Sport
                       |
                       --- oreSelectate
                              |
                              --- "10:00 - 11:00": true
                              |
                              --- "11:00 - 12:00": true
                              |
                              --- //Other properties
    
    通过这种方式,您只需创建一个指向“oreSelectate”节点的引用并使用DatabaseReference的方法,就可以在映射中添加一个新元素,因为“oreSelectate”现在是一个映射,而不是一个数组。除此之外,您还可以简单地将单个子级的值从
    true
    更改为
    false
    ,并在UI中显示新的可用性,而无需读取客户端上的整个阵列

    为了更好地理解,我建议您阅读以下帖子中Frank van Puffelen的精彩回答:


    为了更好地理解,您想在“oreSelectate”下的数据库中添加一个新元素,例如,
    “1”:“11:00-12:00”
    ?是的,这正是我想做的“oreSelectate”是一个数组,您有责任更改数据库模式吗?我想我不明白这个问题。基本上,我希望oreSelectate能够节省租用足球场的时间,因此用户可以选择时间。例如,允许您将该属性的类型更改为地图吗?谢谢!这很管用。非常感谢你!很高兴听到:)不客气,马吕斯!
    Firebase-root
      |
      --- TerenuriFotbal
            |
            --- Sector 3
                  |
                  --- Asii Sport
                       |
                       --- oreSelectate
                              |
                              --- "10:00 - 11:00": true
                              |
                              --- "11:00 - 12:00": true
                              |
                              --- //Other properties