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