Ключ изменения базы данных Firebase (копирование по новому пути, удаление старого пути) приводит к сбою приложения - PullRequest
0 голосов
/ 07 сентября 2018

В моем приложении у каждого пользователя есть уникальное имя пользователя, я сохраняю данные пользователя так:

root:
  +users:
    +ricksanchez:
      +name:"Rick Sanchez";
      +email:"rick@sanchez.com";
      +bio:"I'm super smart";
      +followers:
        +follower1:morty;
        +follower2:summer;

Когда я хочу изменить имя пользователя, мне нужно изменить ключ базы данных, но у firebase нет никакого способа сделать это, поэтому я использую следующий код:

private void copyRecord(DatabaseReference fromPath, final DatabaseReference toPath) {
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            toPath.setValue(dataSnapshot.getValue()).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isComplete()) {
                        Log.d(TAG, "Success!");
                    } else {
                        Log.d(TAG, "Copy failed!");
                    }
                }
            });
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    fromPath.addListenerForSingleValueEvent(valueEventListener);
}

Этот код отлично работает в первый раз, но когда я запускаю этот код во второй раз, не закрывая приложение, приложение вылетает, но когда я снова запускаю приложение после сбоя, оно работает отлично, но снова во второй раз, когда происходит сбой

Также я использую этот код во фрагменте, и я загружаю свой фрагмент с этим кодом:

public void pushFragment(Fragment fragment){
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.add(R.id.mainframe,fragment).hide(getCurrentFragment()).addToBackStack(null).commit();
}

Мой журнал ошибок:

java.lang.IllegalStateException: Fragment UsernameChangeFragment{2a2928de} not attached to a context.
    at android.support.v4.app.Fragment.requireContext(Fragment.java:693)
    at android.support.v4.app.Fragment.getResources(Fragment.java:757)
    at android.support.v4.app.Fragment.getString(Fragment.java:779)
    at sonata.com.sonata.Util.UsernameChangeFragment$2$1.onDataChange(UsernameChangeFragment.java:90)
    at com.google.android.gms.internal.firebase_database.zzfc.zza(Unknown Source)
    at com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source)
    at com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:155)
    at android.app.ActivityThread.main(ActivityThread.java:5696)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

У вас есть идеи, почему?

редактировать: код моего сбойного фрагмента:

usernameedittext.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence text, int start, int before, int count) {
            if(text.length()>0){
                if(!text.toString().equals(username)){
                    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users").child(text.toString());

                    ref.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            if(!dataSnapshot.exists()){







                                /* this is my error line*/ uyarıtext.setText(getString(R.string.youcantakethisusername));







                                uyarıtext.setTextColor(Color.parseColor("#00ff00"));
                                uyarıtext.setVisibility(View.VISIBLE);
                            }
                            else{
                                uyarıtext.setText(getString(R.string.usernametaken));
                                uyarıtext.setTextColor(Color.parseColor("#ff0000"));
                                uyarıtext.setVisibility(View.VISIBLE);
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });
                }
                else{
                    uyarıtext.setVisibility(View.INVISIBLE);

                }

            }
            else{
                uyarıtext.setVisibility(View.INVISIBLE);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });


        savebutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("1","butona tıklandı");

                    if (usernameedittext.getText().toString().length() > 0 && !usernameedittext.getText().toString().equals(username)) {
                        Log.i("2","yeni username kriterleri uygun");

                        yeni.child(usernameedittext.getText().toString()).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                if (!dataSnapshot.exists()) {
                                    Log.i("3","kullanıcı adı uygun");

                                    copyRecord(eski, yeni.child(usernameedittext.getText().toString()));
                                    Log.i("15","copyrecord bitti");
                                } else {
                                    uyarıtext.setText(getString(R.string.usernametaken));
                                    uyarıtext.setTextColor(Color.parseColor("#ff0000"));
                                    uyarıtext.setVisibility(View.VISIBLE);
                                }
                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {

                            }
                        });

                    }

            }

        });

Также мой фрагмент реестра падает с такой же ошибкой;

username.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence text, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence text, int start, int before, int count) {


            if (text.length()>0) {


                database.child("users").child(text.toString()).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                        if (!dataSnapshot.exists()) {
                            uyarıtext.setVisibility(View.VISIBLE);
                            uyarıtext.setText(getResources().getString(R.string.youcantakethisusername));
                            uyarıtext.setTextColor(Color.parseColor("#00ff00"));
                        } else {
                            uyarıtext.setVisibility(View.VISIBLE);

/ * это моя строка ошибки * /

uyarıtext.setText (. GetResources () GetString (R.string.usernametaken));

                            uyarıtext.setTextColor(Color.parseColor("#ff0000"));
                        }

                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
            }
            else{
                uyarıtext.setVisibility(View.INVISIBLE);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });



    register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("1","butona tıklandı");
            if(namesurname.getText().toString()!=null&&email.getText().toString()!=null&&password.getText().toString()!=null){
                Log.i("2","edittextler boş değil");
                progressDialog.show();
                Log.i("3","propgres gösterildi");
                    database.child("users").child(username.getText().toString()).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            if (!dataSnapshot.exists()) {
                                Log.i("4","girilen kullanıcı adı alınabilir");
                                if (isValidEmail(email.getText().toString())) {
                                    Log.i("5","e posta geçerli");
                                    auth.createUserWithEmailAndPassword(email.getText().toString(), password.getText().toString()).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                                        @Override
                                        public void onComplete(@NonNull Task<AuthResult> task) {
                                            if (!task.isSuccessful()) {
                                                try {
                                                    throw task.getException();
                                                } catch (FirebaseAuthWeakPasswordException e) {
                                                    uyarıtext.setVisibility(View.VISIBLE);
                                                    progressDialog.hide();
                                                    uyarıtext.setTextColor(Color.parseColor("#ff0000"));
                                                    uyarıtext.setText(getResources().getString(R.string.weakpassword));
                                                } catch (FirebaseAuthInvalidCredentialsException e) {
                                                    uyarıtext.setVisibility(View.VISIBLE);
                                                    progressDialog.hide();
                                                    uyarıtext.setTextColor(Color.parseColor("#ff0000"));
                                                    uyarıtext.setText(getResources().getString(R.string.invalidemail));

                                                } catch (FirebaseAuthUserCollisionException e) {
                                                    uyarıtext.setVisibility(View.VISIBLE);
                                                    progressDialog.hide();
                                                    uyarıtext.setTextColor(Color.parseColor("#ff0000"));
                                                    uyarıtext.setText(getResources().getString(R.string.emailtaken));

                                                } catch (Exception e) {

                                                }
                                            } else {
                                                Log.i("6","kullanıcı oluşturudu");

                                                DatabaseReference ref = database.child("users").child(username.getText().toString());
                                                Log.i("7","username'e refereans oluşturuldu");
                                                DatabaseReference refuidusername = database.child("uidusername").child(auth.getUid());
                                                Log.i("8","uid refereansı oluşturuldu");
                                                refuidusername.setValue(username.getText().toString());
                                                Log.i("9","uidusername değeri yazıldı");
                                                User user = new User();
                                                Log.i("10","yeni user oluşturuldu");
                                                user.setUId(auth.getUid());
                                                Log.i("11","yeni useruid değeri yazıldı");
                                                user.setNamesurname(namesurname.getText().toString());
                                                Log.i("12","yeni user adsoyad değeri yazıldı");
                                                user.setEmail(email.getText().toString());
                                                Log.i("13","yeni user email değeri yazıldı");
                                                ref.setValue(user);
                                                Log.i("14","databse bu yser verileri yüklendi");
                                                progressDialog.hide();
                                                Log.i("15","progresdialog gizlendi");
                                                FragmentTransaction ft = getFragmentManager().beginTransaction();
                                                Log.i("16","gragmenttransaction.getfragmentmanager.begintransaction");
                                                for (int i = 0; i < getFragmentManager().getBackStackEntryCount(); i++) {
                                                    getFragmentManager().popBackStack();

                                                }
                                                Log.i("17","backstack temizlendi");
                                                ft.replace(R.id.mainframe, new MainFragment()).commit();

                                            }
                                        }
                                    });


                                } else {
                                    toast(getResources().getString(R.string.invalidemail));
                                    progressDialog.hide();

                                }

                            } else {
                                uyarıtext.setVisibility(View.VISIBLE);
                                uyarıtext.setText(getResources().getString(R.string.usernametaken));
                                uyarıtext.setTextColor(Color.parseColor("#ff0000"));
                                progressDialog.hide();

                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });

            }
        }
    });

1 Ответ

0 голосов
/ 08 сентября 2018

Это определенно , а не проблема Firebase.Ошибка говорит о том, что ваш UsernameChangeFragment не привязан к контексту, что означает, что ваш фрагмент не принадлежит деятельности.Чтобы решить эту проблему, каждый раз, когда вам нужно использовать context, просто проверяйте активность на ничтожность:

Activity activity = getActivity();
if(activity != null) {
    //Your logic
}

Существует также другая опция, которая подразумевает использование isAdded () метод, который является одним из методов фрагмента, который может помочь вам определить, привязан ли текущий фрагмент к его активности или нет.

if(isAdded()) {
    //Your logic
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...