Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 继续从Android在Firebase数据库的现有阵列中插入新数据_Java_Android_Firebase_Firebase Realtime Database_Geofencing - Fatal编程技术网

Java 继续从Android在Firebase数据库的现有阵列中插入新数据

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));

我刚刚开始学习android studio,我正在进行一个基于位置的项目,将位置信息插入Firebase。我遵循了youtube上的教程[,但是视频中只显示了代码中的插入数据,如下所示

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故意不提供使用顺序数字键插入项目的操作。请参阅:

  • 关于
  • 上的经典博客文章
也就是说,可以使用带有顺序数字索引的类似数组的结构,并且可以使用自动ID


使用顺序数字索引 要将键为
4
的新项目添加到当前结构中,您需要:

  • 确定最高键
  • 添加一个键高一个的子节点
  • 最简单的格式如下(在Android上):

    正如您所看到的,这是相当多的代码。这在很大程度上是需要的,因为多个用户可能会在几乎相同的时间访问同一位置,我们需要处理这一点。Firebase使用乐观锁定,但当有多个用户时,上述可能仍然是一个严重的瓶颈。另外:这比简单的
    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();
        }
    });