Java 继续从Android在Firebase数据库的现有阵列中插入新数据
我刚刚开始学习android studio,我正在进行一个基于位置的项目,将位置信息插入Firebase。我遵循了youtube上的教程[,但是视频中只显示了代码中的插入数据,如下所示Java 继续从Android在Firebase数据库的现有阵列中插入新数据,java,android,firebase,firebase-realtime-database,geofencing,Java,Android,Firebase,Firebase Realtime Database,Geofencing,我刚刚开始学习android studio,我正在进行一个基于位置的项目,将位置信息插入Firebase。我遵循了youtube上的教程[,但是视频中只显示了代码中的插入数据,如下所示 infectedArea = new ArrayList<>(); infectedArea.add(new LatLng(2.2258162, 102.4497224)); infectedArea.add(new LatLng(2.2252313, 102.4563797));
infectedArea = new ArrayList<>();
infectedArea.add(new LatLng(2.2258162, 102.4497224));
infectedArea.add(new LatLng(2.2252313, 102.4563797));
infectedArea.add(new LatLng(2.2261818, 102.4551067));
infectedArea.add(new LatLng(2.275295,102.444035));
FirebaseDatabase.getInstance()
.getReference("InfectedArea")
.child("Location")
.setValue(infectedArea)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(MapsActivity.this, "Updated!", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MapsActivity.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
infectedArea=newArrayList();
新增感染区域(新板条(2.2258162102.4497224));
新增感染区域(新板条(2.225231102.4563797));
感染区添加(新板条(2.22618181102.4551067));
新增受感染区域(新LatLng(2.275295102.444035));
FirebaseDatabase.getInstance()
.getReference(“受感染地区”)
.儿童(“地点”)
.setValue(受感染区域)
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
Toast.makeText(MapsActivity.this,“Updated!”,Toast.LENGTH\u SHORT.show();
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Toast.makeText(MapsActivity.this,“+e.getMessage(),Toast.LENGTH\u SHORT.show();
}
});
下面是我的firebase的快照
索引为0、1、2和3的是从代码中插入的。现在我正试图继续从输入表单中插入数据,但生成了随机键,无法创建新的地理围栏。是否仍要继续使用硬键插入数据
我正在考虑删除硬键,只使用生成的键,但我不知道如何更改代码以创建多个geofence。它将存储在HashMap上,因此您可以
getkey
获取随机键,然后获取随机键,您可以插入数据
DatabaseReference database = FirebaseDatabase.getInstance().getReference("InfectedArea").child("Location");
database_course.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot ds :dataSnapshot.getChildren()){
String key = ds.getKey();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Firebase故意不提供使用顺序数字键插入项目的操作。请参阅:
- 关于
- 上的经典博客文章
使用顺序数字索引 要将键为
4
的新项目添加到当前结构中,您需要:
push().setValue(…)
对初始数据集和新数据使用自动ID 一旦您意识到仅调用
push()
还不能写入数据库,您就可以轻松地使用推送ID(这些是push()
生成的键)写入所有点。您可以使用以下纯Android代码获得新的推送ID:
String pushID = ref.push().getKey();
知道了这一点,我们可以将您的代码更改为将初始位置插入到:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
// It doesn't matter what the reference points to, as push IDs are statistically guaranteed to be unique, independent of their location.
Map<String, Object> values = new HashMap<>();
infectedArea.put(ref.push().getKey(), new LatLng(2.2258162, 102.4497224));
infectedArea.put(ref.push().getKey(), new LatLng(2.2252313, 102.4563797));
infectedArea.put(ref.push().getKey(), new LatLng(2.2261818, 102.4551067));
infectedArea.put(ref.push().getKey(), new LatLng(2.275295,102.444035));
FirebaseDatabase.getInstance()
.getReference("InfectedArea")
.child("Location")
.setValue(values)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(MapsActivity.this, "Updated!", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MapsActivity.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
databasereferef=FirebaseDatabase.getInstance().getReference();
//参考点指向什么并不重要,因为推ID在统计上是唯一的,独立于它们的位置。
映射值=新的HashMap();
感染区域放置(参考push().getKey(),新车床(2.2258162102.4497224));
感染区域放置(参考push().getKey(),新车床(2.225231102.4563797));
感染区域放置(参考push().getKey(),新车床(2.22618181102.4551067));
感染区域放置(参考push().getKey(),新车床(2.275295102.444035));
FirebaseDatabase.getInstance()
.getReference(“受感染地区”)
.儿童(“地点”)
.setValue(值)
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
Toast.makeText(MapsActivity.this,“Updated!”,Toast.LENGTH\u SHORT.show();
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Toast.makeText(MapsActivity.this,“+e.getMessage(),Toast.LENGTH\u SHORT.show();
}
});
这将产生与您所知道的类似的结构,但所有键都是push ID。Firebase故意不提供使用顺序数字键插入项目的操作。请参阅,您的示例显示了如何从代码中插入数据,但如果我要从输入表单中插入数据呢?您可以从你的问题也在代码中显示了这个问题,所以这就是我的答案。
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
// It doesn't matter what the reference points to, as push IDs are statistically guaranteed to be unique, independent of their location.
Map<String, Object> values = new HashMap<>();
infectedArea.put(ref.push().getKey(), new LatLng(2.2258162, 102.4497224));
infectedArea.put(ref.push().getKey(), new LatLng(2.2252313, 102.4563797));
infectedArea.put(ref.push().getKey(), new LatLng(2.2261818, 102.4551067));
infectedArea.put(ref.push().getKey(), new LatLng(2.275295,102.444035));
FirebaseDatabase.getInstance()
.getReference("InfectedArea")
.child("Location")
.setValue(values)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(MapsActivity.this, "Updated!", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MapsActivity.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
}
});