Java 使用多个子键重命名firebase中的键

Java 使用多个子键重命名firebase中的键,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我有一个活动,允许用户更改其UserPIN(考勤记录表下的即时键),并且我已经了解到,除了再次删除和添加更新数据外,没有其他方法更新Firebase实时数据库。我的问题是我必须更新表中的键,但它有多个子键和大量数据。如何访问子密钥并存储它们?数据更新不会花费很多时间吗 假设我必须更新密钥:123452 考勤记录表 除了我在下面尝试过的方法之外,如果还有其他方法,我会洗耳恭听的 编辑 我已达到通过以下方式从考勤记录表中检索数据的水平: rootRefAttTable = FirebaseData

我有一个活动,允许用户更改其UserPIN(考勤记录表下的即时键),并且我已经了解到,除了再次删除和添加更新数据外,没有其他方法更新Firebase实时数据库。我的问题是我必须更新表中的键,但它有多个子键和大量数据。如何访问子密钥并存储它们?数据更新不会花费很多时间吗

假设我必须更新密钥:123452

考勤记录表

除了我在下面尝试过的方法之外,如果还有其他方法,我会洗耳恭听的

编辑

我已达到通过以下方式从考勤记录表中检索数据的水平:

rootRefAttTable = FirebaseDatabase.getInstance()
                                  .getReference("Attendance_Records")
                                  .child(carriedmPIN);
newRefAttTable = FirebaseDatabase.getInstance()
                                 .getReference("Attendance_Records");
attRec = new Attendance_Records();
然后

但是,添加到数据库的方式与它应该的方式不同:

之前

之后


很抱歉更新前的图像。更新后(123450到123459),第3个月和第4个月合并在一起,目前我没有2年的时间(假设是2018年和2019年),否则我认为他们也会加入。我如何纠正这个错误?

< p>我猜这里的问题是,<代码> MunthKEY <代码>是常见的,如果我正确的话,它是<强> 04 < /强>,所以默认情况下,FixBASE把它看成是同一个孩子,并将所有的东西都添加到

但是回到主要问题,更改pin,您是否尝试过以下方法:

编辑: 您为什么不使用Firebase为添加的每个孩子提供的唯一id更改数据库的结构,并将其用作密钥,然后在孩子中为pin添加一个字段

这将首先确保您的所有孩子在以后不会发生冲突,如果您有使用公共PIN的用户,第二,它将使在临时对象上检索整个用户对象变得更容易,更改其中的PIN值,然后使用提供的唯一id再次将其推送到同一个孩子

如果您想知道如何获取此唯一id,我还建议将其保存为对象中的字段,在推送对象时保存,并在需要时从检索到的临时对象中检索

处理这一切的最佳方法是通过
onchildaded
onChildChanged
方法,而不是手动(提示:尝试将数据库拆分为不同的引用,这将使您更容易管理
ChildListener

我终于做到了

有时,您需要更深入的逻辑,但所需的只是一个简单的代码

我是这样做的:

rootRefAttTable = FirebaseDatabase.getInstance().getReference("Attendance_Records").child(carriedmPIN);

newRefAttTable = FirebaseDatabase.getInstance().getReference("Attendance_Records");
CarriedPIN是用户需要更改的PIN

private void changeAttTable() {

    Log.d("abcd","changeAttTable() reached");

     rootRefAttTable.addListenerForSingleValueEvent(new ValueEventListener() {
         @Override
         public void onDataChange(DataSnapshot dataSnapshot) {
             for(DataSnapshot yearsnap:dataSnapshot.getChildren()){
                for(DataSnapshot monthsnap:yearsnap.getChildren()){
                    for(DataSnapshot datesnap:monthsnap.getChildren()){
                        dateAtt = datesnap.child("date").getValue(String.class);
                        Log.d("abcd","date is: "+dateAtt);
                        entrydateAtt = datesnap.child("entryDate").getValue(String.class);
                        Log.d("abcd","enteryDate is: "+entrydateAtt);
                        intimeAtt = datesnap.child("inTime").getValue(String.class);
                        Log.d("abcd","inTime is: "+intimeAtt);
                        monthAtt = datesnap.child("month").getValue(String.class);
                        Log.d("abcd","month is: "+monthAtt);
                        myidAtt = datesnap.child("myID").getValue(String.class);
                        Log.d("abcd","myID is: "+myidAtt);
                        outtimeAtt = datesnap.child("outTime").getValue(String.class);
                        Log.d("abcd","outTime is: "+outtimeAtt);
                        statusAtt = datesnap.child("status").getValue(String.class);
                        Log.d("abcd","status is: "+statusAtt);
                        yearAtt = datesnap.child("year").getValue(String.class);
                        Log.d("abcd","year is: "+yearAtt);

                        getValuesAtt();
                        newRefAttTable.child(enterednewmpin).child(yearsnap.getKey()).child(monthsnap.getKey()).child(datesnap.getKey()).setValue(attRec);
                    }
                }

             }
         newRefAttTable.child(carriedmPIN).removeValue();
         }

         @Override
         public void onCancelled(DatabaseError databaseError) {

         }

     });

}

private void getValuesAtt(){
    Log.d("abcd","getValuesAtt() reached");

    attRec.setYear(yearAtt);
    attRec.setMonth(monthAtt);
    attRec.setMyID(myidAtt);
    attRec.setEntryDate(entrydateAtt);
    attRec.setStatus(statusAtt);
    attRec.setOutTime(outtimeAtt);
    attRec.setInTime(intimeAtt);
    attRec.setDate(dateAtt);
}

我太高兴了!!很长一段时间以来,我一直被困在这个问题上!!:P

我认为直接使用setValue不会起作用,因为它最多只能重命名我的密钥,所有子项都将被删除。是的,我刚刚检查了它,我确信有一种方法可以改变特定的值,或者改变数据库结构,比如将pin保存为对象中的字段?嘿!我之前检查过,在Firebase中无法重命名任何内容,我们需要删除并重新设置该值。对于不太复杂的数据库来说,这很容易做到,但我的数据库有多个级别:/I我不能更改数据库结构,因为根据这个PIN,我只允许用户每月查看他们的出勤情况。[这个视频系列]()应该澄清这样一个想法,即当涉及到NoSQL数据库时,您需要转向扁平结构,希望它能有所帮助!然而,在您的情况下,如果您坚持按原样保存结构,我想通过添加PIN字段并使用Firebase提供的密钥,您可以在
onchildadded
中提取PIN和密钥列表,然后通过用户输入PIN,您可以使用链接到它的密钥从DB中获取对象。(不过我想你还是需要考虑一下PIN复制)
private void changeAttTable() {

    Log.d("abcd","changeAttTable() reached");

     rootRefAttTable.addListenerForSingleValueEvent(new ValueEventListener() {
         @Override
         public void onDataChange(DataSnapshot dataSnapshot) {
             for(DataSnapshot yearsnap:dataSnapshot.getChildren()){
                for(DataSnapshot monthsnap:yearsnap.getChildren()){
                    for(DataSnapshot datesnap:monthsnap.getChildren()){
                        dateAtt = datesnap.child("date").getValue(String.class);
                        Log.d("abcd","date is: "+dateAtt);
                        entrydateAtt = datesnap.child("entryDate").getValue(String.class);
                        Log.d("abcd","enteryDate is: "+entrydateAtt);
                        intimeAtt = datesnap.child("inTime").getValue(String.class);
                        Log.d("abcd","inTime is: "+intimeAtt);
                        monthAtt = datesnap.child("month").getValue(String.class);
                        Log.d("abcd","month is: "+monthAtt);
                        myidAtt = datesnap.child("myID").getValue(String.class);
                        Log.d("abcd","myID is: "+myidAtt);
                        outtimeAtt = datesnap.child("outTime").getValue(String.class);
                        Log.d("abcd","outTime is: "+outtimeAtt);
                        statusAtt = datesnap.child("status").getValue(String.class);
                        Log.d("abcd","status is: "+statusAtt);
                        yearAtt = datesnap.child("year").getValue(String.class);
                        Log.d("abcd","year is: "+yearAtt);

                        getValuesAtt();
                        newRefAttTable.child(enterednewmpin).child(yearsnap.getKey()).child(monthsnap.getKey()).child(datesnap.getKey()).setValue(attRec);
                    }
                }

             }
         newRefAttTable.child(carriedmPIN).removeValue();
         }

         @Override
         public void onCancelled(DatabaseError databaseError) {

         }

     });

}

private void getValuesAtt(){
    Log.d("abcd","getValuesAtt() reached");

    attRec.setYear(yearAtt);
    attRec.setMonth(monthAtt);
    attRec.setMyID(myidAtt);
    attRec.setEntryDate(entrydateAtt);
    attRec.setStatus(statusAtt);
    attRec.setOutTime(outtimeAtt);
    attRec.setInTime(intimeAtt);
    attRec.setDate(dateAtt);
}