0

Firebaseデータベースにユーザ情報を保存しようとしていますが、奇妙な動作が発生して保存ボタンを押して、私は、ユーザーが自分の名または姓か何かを変更したい場合は、プロファイルの活動に利用者情報を更新することに注意し、ボタンを保存するための方法であるFirebaseにデータを保存した後でアクティビティが再開します

public void userData() { 
    user.setFName(Fname.getText().toString()); 
    user.setLName(Lname.getText().toString()); 
    user.setEmail(Email.getText().toString()); 
    user.setAddress(userAddress.getText().toString()); 
    user.setPassword(UserInfo.getString("Password", "")); 
    user.setID(CicID.getText().toString()); 
    user.setUsername(Usnm.getText().toString()); 
    if (bAdmn.isChecked()) user.setMajor("Business Administrator"); 
    if (BTech.isChecked()) user.setMajor("Business Tech"); 
    if (masscom.isChecked()) user.setMajor("Mass Com"); 
    if (Eng.isChecked()) user.setMajor("Engineering"); 

    final String us = user.getUsername(); 
    Log.i("Username", us); 
    MyDatabase1.child("USERS").child(us).setValue(user); 
    Intent i = new Intent(getApplicationContext() , chooseCoursesActivity.class); 
    startActivity(i); 

} 

。 [保存]ボタンをクリックした後、データは正しく保存されますが、意図は決して実行されません。同じアクティビティを再作成します。 Loginアクティビティには、ユーザ名とパスワードを確認してデータに基づいてログインを試みるaLoginボタンがあります。ログインに成功すると、そのProfile Activityに移動します。 プロファイルアクティビティの保存ボタンreログインアクティビティのログインボタンのメソッドをすべて実行して、再作成問題の原因となるプロファイルアクティビティに移動します。 はここでログインボタンのコードです:これはあまりにも長い作るため

MyDatabase = FirebaseDatabase.getInstance().getReference(); 
    MyDatabase.child("USERS").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      boolean exists = false; 

      for (DataSnapshot child : dataSnapshot.getChildren()) { 
       final Map<String, Object> model = (Map<String, Object>) child.getValue(); 

       if (model.get("username").equals(Username.getText().toString())) { 
        exists = true; 
        Log.i("USername"," Correct"); 


        if(exists){ 
         MyDatabase.child("USERS").orderByChild("username").equalTo(Username.getText().toString()) 

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

           for (DataSnapshot child :dataSnapshot.getChildren()){ 
            Log.i("Password",child.getValue().toString()); 
            Log.i("Password",child.child("password").toString()); 
            if(password.getText().toString().equals(child.child("password").getValue())){ 
             Log.i("LOGIN","Success"); 
             loginsuccessful = true ; 

            if(loginsuccessful){ 

             saveCredntials(Username.getText().toString(),password.getText().toString()); 


             Intent i2 = new Intent(getApplicationContext(), ProfileActivity.class); 
             i2.putExtra("loginStats",IsLoggedIn); 
             i2.putExtra("Username",Un); 

             i2.putExtra("Password",Pw); 


             startActivity(i2); 
             finish();} 
            }else{ 
             Log.i("LOGIN","Failed"); 
             loginsuccessful= false ; 

            } 

           } 

          } 

          @Override 
          public void onCancelled(DatabaseError databaseError) { 
              Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show(); 
          } 
         }); 
        } 
        break; 

       }else { 
        Log.i("LOGIN","FAiled"); 

       } 

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

     } 
    }); 
} 

申し訳ありませんが、私はこの問題を知りません。

答えて

1

この問題を解決しました。あなたの場合によるとを避けてaddValueEventListenerを使用してください。データベースに加えたすべての変更をリッスンするためです。そのため、データベースに変更を加えるたびに、addValueEventListener(startActivity)のコードは、そのログイン関数を呼び出すかどうかにかかわらず実行されます。

私の提案はaddListenerForSingleValueEvent代わりのaddValueEventListenerを(必ずALLaddListenerForSingleValueEventにあなたのAndroidプロジェクトでaddValueEventListenerを変更してください)を使用している、またはあなたが本当にそれを必要としない場合でも、リスナーを削除することができます。私はそれが良いデザインであるかどうかは分かりませんが、あなたの問題を解決できるはずです。

-1

firebaseリスナーにstartActivityを配置しないようにします。 startActivityは、firebaseデータベースに値が追加または削除されるたびに実行されます。

+0

これは質問に対する答えを提供しません。十分な[評判](https://stackoverflow.com/help/whats-reputation)があれば、[投稿にコメントする]ことができます(https://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの明確化を必要としない回答を提供する](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 - [レビューから](/レビュー/低品質の投稿/ 16818176) –