Информация о курсоре SQLite полностью отказывается обновлять базу данных Firebased - PullRequest
0 голосов
/ 16 октября 2019

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

Я использую цикл for для полученияэлемент за раз из курсора и отправить его в базу данных firebased.

Моя проблема в том, что код успешно отправляет только первый элемент и отказывается отправлять оставшиеся элементы.

Мой код каксм. ниже.

private void AddData(){
    Cursor cursorAddData = myDB.queryStaffList(new String[]{SERIAL_NO_COLUMN, EMAIL_COLUMN, TOKEN_COLUMN,}, null, null);
    Log.i(TAG+ " addDataCheck", "no of data: "+cursorAddData.getCount());

    if(cursorAddData.moveToFirst()){
        for(int i=0; i<cursorAddData.getCount(); i++){

            FirebaseDatabase.getInstance().getReference()
                    .child("ADMINISTRATORS")
                    .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                    .child("STAFF LIST")
                    .child(cursorAddData.getString(cursorAddData.getColumnIndex(TOKEN_COLUMN)))
                    .setValue(cursorAddData.getString(cursorAddData.getColumnIndex(EMAIL_COLUMN)))
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if(task.isSuccessful()){

                                Toast.makeText(StaffList.this, "staff entered successfully.", Toast.LENGTH_SHORT).show();

                                Log.i(TAG+ " addDataCheck", "email entered: "+cursorAddData.getString(cursorAddData.getColumnIndex(EMAIL_COLUMN)));
                                cursorAddData.moveToNext();
                                if(cursorAddData.isAfterLast()){
                                cursorAddData.close();
                                }

                            }else{
                                Toast.makeText(StaffList.this, "staff not entered!", Toast.LENGTH_SHORT).show();
                                cursorAddData.moveToNext();
                                if(cursorAddData.isAfterLast()){
                                cursorAddData.close();
                                }
                            }
                        }
                    });

        }

}

Вызов этого метода отправляет только первый элемент, возвращенный курсором, в firebasedatase, оставляя остальные.

My Logcat показывает, что задачауспешно для любого количества вызовов.

Затем я попробовал другой подход, заполнив некоторые переменные String Array информацией курсора перед отправкой в ​​базу данных firebased следующим образом:

private void AddData(){
    Cursor cursorAddData = myDB.queryStaffList(new String[]{SERIAL_NO_COLUMN, EMAIL_COLUMN, TOKEN_COLUMN,}, null, null);
    Log.i(TAG+ " addDataCheck", "no of data: "+cursorAddData.getCount());

    String[] emails = new String[cursorAddData.getCount()];
    String[] tokens = new String[cursorAddData.getCount()];

    if(cursorAddData.moveToFirst()){

        for(int i=0; i<emails.length; i++){
            emails[i] = cursorAddData.getString(cursorAddData.getColumnIndex(EMAIL_COLUMN));
            tokens[i] = cursorAddData.getString(cursorAddData.getColumnIndex(TOKEN_COLUMN));
            cursorAddData.moveToNext();
        }

        for(int i=0; i<cursorAddData.getCount(); i++){

            FirebaseDatabase.getInstance().getReference()
                    .child("ADMINISTRATORS")
                    .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                    .child("STAFF LIST")
                    .child(tokens[i])
                    .setValue(emails[i])
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if(task.isSuccessful()){

                                Toast.makeText(StaffList.this, "staff entered successfully.", Toast.LENGTH_SHORT).show();
                                /*Log.i(TAG+ " addDataCheck", "no of data: "+emails[10]);
                                Log.i(TAG+ " addDataCheck", "email entered: "+cursorAddData.getString(cursorAddData.getColumnIndex(EMAIL_COLUMN)));
                                cursorAddData.moveToNext();
                                if(cursorAddData.isAfterLast()){
                                    cursorAddData.close();
                                }*/

                            }else{
                                Toast.makeText(StaffList.this, "staff not entered!", Toast.LENGTH_SHORT).show();
                                /*cursorAddData.moveToNext();
                                if(cursorAddData.isAfterLast()){
                                    cursorAddData.close();
                                }*/
                            }
                        }
                    });

        }
    }


    cursorAddData.close();

}

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

...