代码之家  ›  专栏  ›  技术社区  ›  uzaysan

Firebase数据库更改密钥(复制到新路径删除旧路径)使我的应用程序崩溃

  •  0
  • uzaysan  · 技术社区  · 8 年前

    在我的应用程序中,每个用户都有一个唯一的用户名。我保存的用户数据如下:

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

    乌亚尔±文本.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 回复  |  直到 8 年前
        1
  •  0
  •   Alex Mamo    8 年前

    这绝对是 火基问题。错误表明你的 UsernameChangeFragment context ,只需检查活动是否为空:

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

    还有另一种选择,意味着使用 isAdded()

    if(isAdded()) {
        //Your logic
    }