Переименование ключей в Firebase с несколькими подразделами - PullRequest
0 голосов
/ 03 мая 2018

У меня есть действие, в котором я разрешаю пользователю изменять свой UserPIN (непосредственный ключ в таблице Attendance_Records), и я прочитал, что нет никакого способа обновить базу данных Firebase Realtime, кроме удаления и добавления данных с обновлением снова , Моя проблема в том, что мне нужно обновить ключ в таблице, но в ней есть несколько подразделов и много данных. Как я могу получить доступ к подразделам и сохранить их? Не займет ли обновление данных много времени?

Предположим, мне нужно обновить ключ: 123452

Таблица посещений_Records

enter image description here

Я весь слух, если есть какой-либо другой способ сделать это, кроме того, что я попробовал ниже

EDIT

Я достиг уровня, на котором я могу получить данные из таблицы Attendance_Records, используя:

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

тогда

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

rootRefAttTable.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){

            for(DataSnapshot yearsnap:dataSnapshot.getChildren()){
                yearKey = yearsnap.getKey();
                Log.d("abcd","yearKey is: "+yearKey);

                monthkeyRef = rootRefAttTable.child(yearKey);
                monthkeyRef.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if(dataSnapshot.exists()){
                            for(DataSnapshot monthsnap:dataSnapshot.getChildren()){
                                monthKey = monthsnap.getKey();

                                datekeyRef = monthkeyRef.child(monthKey);
                                datekeyRef.addListenerForSingleValueEvent(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                        if(dataSnapshot.exists()){

                                            for(DataSnapshot datesnap:dataSnapshot.getChildren()){
                                                dateKey = datesnap.getKey();


                                                date = datesnap.child("date").getValue(String.class);
                                                enteryDate = datesnap.child("entryDate").getValue(String.class);
                                                inTime = datesnap.child("inTime").getValue(String.class);
                                                month = datesnap.child("month").getValue(String.class);
                                                myID = datesnap.child("myID").getValue(String.class);
                                                outTime = datesnap.child("outTime").getValue(String.class);
                                                status = datesnap.child("status").getValue(String.class);
                                                year = datesnap.child("year").getValue(String.class);

                                                addDataAttTable();
                                            }
                                        }
                                    }

                                    @Override
                                    public void onCancelled(DatabaseError databaseError) {

                                    }
                                });
                            }
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
}

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

attRec.setYear(year);
attRec.setMonth(month);
attRec.setMyID(myID);
attRec.setEntryDate(enteryDate);
attRec.setStatus(status);
attRec.setOutTime(outTime);
attRec.setInTime(inTime);
attRec.setDate(date);
}

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

getValuesAtt();
newRefAttTable.child(carriedmPIN).removeValue();
newRefAttTable.child(enterednewmpin).child(yearKey).child(monthKey).child(dateKey).setValue(attRec);
}

Но, добавление в базу данных не так, как должно было быть:

До

enter image description here

* После 1040 *

enter image description here

Извините за изображение перед обновлением. После обновления (с 123450 по 123459) месяцы 3 и 4 объединяются, и на данный момент у меня нет 2 лет (предположим, 2018 и 2019), иначе я думаю, что они также присоединились бы. Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Я наконец сделал это !!

Иногда вы думаете о более глубокой логике, но для этого нужен простой код!

Я сделал это:

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

newRefAttTable = FirebaseDatabase.getInstance().getReference("Attendance_Records");

carrymPIN - это ПИН-код, который необходимо изменить.

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

0 голосов
/ 03 мая 2018

Я полагаю, что проблема здесь в том, что monthKey является общим, 04 , если я правильно понял, поэтому по умолчанию Firebase считает его тем же дочерним элементом и добавит все в.

Но вернемся к основному вопросу, Смена пина , вы пробовали это:

EDIT: Почему бы вам не изменить структуру вашей базы данных, используя уникальный идентификатор, который Firebase предоставляет каждому добавленному дочернему элементу, и использовать его в качестве ключа, а затем добавить поле в свой дочерний элемент для булавки?

Это, во-первых, гарантирует, что все ваши дети не будут конфликтовать позже, если у вас есть пользователи с общими PIN-кодами, во-вторых, это облегчит извлечение целого объекта пользователя из временного объекта, измените значение PIN-кода. в ней, затем снова нажмите на того же ребенка, используя предоставленный уникальный идентификатор!

Если вам интересно, как получить этот уникальный идентификатор, я также рекомендую сохранить его как поле в вашем объекте, сохранить его, нажимая на ваш объект, и извлекать из полученного временного объекта всякий раз, когда это необходимо.

Лучший способ справиться со всем этим - с помощью методов onChildAdded и onChildChanged, а не вручную ( СОВЕТ: Попробуйте разделить вашу БД на разные ссылки, что облегчит вам задачу управлять ChildListener)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...