0

我試圖在Firebase數據庫中保存用戶信息,但發生了一種奇怪的行爲,使Save按鈕重新啓動同一活動,而不是我爲下一個活動製作的Intent。在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); 

} 

這是保存按鈕,請注意,我想如果用戶想要改變他的姓或名或一些配置文件中的活動更新用戶信息的方法。 但點擊保存按鈕後,數據被正確保存,但意圖從未完成。它重新創建相同的活動。 在登錄活動中有一個登錄按鈕,用於檢查用戶名和密碼,然後嘗試根據數據登錄,如果登錄成功,則會進入該配置文件活動。 配置文件活動中的保存按鈕re在Login Activity中的Login按鈕中執行該方法,該方法檢查所有內容並進入配置文件活動,該配置文件導致重新創建問題。 下面是登錄按鈕的代碼:

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(請確保您更改ALL在你的Android項目的addValueEventListeneraddListenerForSingleValueEvent),或者如果你並不真的需要它,你甚至可以刪除偵聽。我不知道這是不是一個好的設計,但它應該能夠解決你的問題。

-1

避免將startActivity放在Firebase偵聽器上。每當向firebase數據庫中添加或刪除值時,startActivity都會執行。

+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-代替)。 - [來自評論](/ review/low-quality-posts/16818176) –

相關問題