2017-03-06 7 views
2

setUserメソッドで、私はUser、Worker、Manager、またはAdministratorのインスタンスを作成するために使用するデータベースからデータを読み込もうとしています。次の3行のコードが間違っていますが、エラーは発生しませんので、無視してください。私をバッフル何Firebase onDataChangeが入力されていない

String name = mUserDatabase.child(uniqueId).child("name").orderByValue().toString(); 
    int zip = mUserDatabase.child(uniqueId).child("zipcode").orderByValue().hashCode(); 
    String phone = mUserDatabase.child(uniqueId).child("phone number").orderByValue().toString(); 

はOnDataChangeのがSETUSERでonActivityResultに入力されますがされていないことです。私はonDataChangeがsetUserに入力されない理由を理解できません。 firebaseのリファレンスが正しいですし、私はtyp.toString()で記録されたURLに移動し、正しいエントリに移動しました。それが関連している場合、私は公開する権限も設定しています。私はインターネットにも接続しています。私はまた、問題に関連しない答えを持った同様の質問に対する他の回答を見ました。 何が起こって、私は何か助けに感謝するでしょう!

package edu.gatech.cs2340.waterfall.controller; 
import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.widget.ImageView; 

import com.firebase.ui.auth.AuthUI; 
import com.firebase.ui.auth.IdpResponse; 
import com.firebase.ui.auth.ResultCodes; 
import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.Query; 
import com.google.firebase.database.ValueEventListener; 

import java.util.Arrays; 

import edu.gatech.cs2340.waterfall.R; 
import edu.gatech.cs2340.waterfall.model.Administrator; 
import edu.gatech.cs2340.waterfall.model.Manager; 
import edu.gatech.cs2340.waterfall.model.Model; 
import edu.gatech.cs2340.waterfall.model.User; 
import edu.gatech.cs2340.waterfall.model.Worker; 

import static android.R.attr.data; 
import static android.R.attr.dateTextAppearance; 
import static android.R.attr.type; 

public class WelcomeActivity extends AppCompatActivity { 

    private static FirebaseAuth auth; 
    private static final int RC_SIGN_IN = 0; 
    private static DatabaseReference mUserDatabase; 
    private static DatabaseReference mReportDatabase; 
    private static String type; 
    public static FirebaseAuth getAuth() { 
     return auth; 
    } 

    public static DatabaseReference getmUserDatabase() { 
     return mUserDatabase; 
    } 

    public static DatabaseReference getmReportDatabase() { 
     return mReportDatabase; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_welcome); 
     ImageView myImageView = (ImageView)findViewById(R.id.logo); 
     Animation fade = AnimationUtils.loadAnimation(this, R.anim.fade_in); 
     myImageView.startAnimation(fade); 
    } 

    /** 
    * @param view the current view 
    * Open a login screen for the user 
    * If the user is already signed, then open the main activity 
    * Otherwise, open the firebase login 
    */ 
    public void openLoginScreen(View view) { 
     auth = FirebaseAuth.getInstance(); 
     mUserDatabase = FirebaseDatabase.getInstance().getReference("users"); 
     mReportDatabase = FirebaseDatabase.getInstance().getReference("Reports"); 
     if (auth.getCurrentUser() != null) { 
      Log.d("LOGGED", auth.getCurrentUser().getEmail()); 
      Intent intent = new Intent(WelcomeActivity.this, MainActivity.class); 
      setUser(); 
      startActivity(intent); 
      finish(); 
     } else { 
      //open firebase login if current user is null i.e. not signed in 
      startActivityForResult(AuthUI.getInstance() 
          .createSignInIntentBuilder() 
          .setProviders(Arrays.asList(new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(), 
            new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build(), 
            new AuthUI.IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER).build())) 
          .build(), 
        RC_SIGN_IN); 
     } 
    } 

    /** 
    * Retrieve the user details from firebase and set the local current user in the model 
    */ 
    public static void setUser() { 
     Log.d("LOGGED", "SET USER CALLED"); 
     String uniqueId = FirebaseAuth.getInstance().getCurrentUser().getUid(); 
     String email = FirebaseAuth.getInstance().getCurrentUser().getEmail(); 
     Log.d("EMAIL FROM FIREBASE", email); 
     String name = mUserDatabase.child(uniqueId).child("name").orderByValue().toString(); 
     int zip = mUserDatabase.child(uniqueId).child("zipcode").orderByValue().hashCode(); 
     String phone = mUserDatabase.child(uniqueId).child("phone number").orderByValue().toString(); 

     DatabaseReference typ = mUserDatabase.child(uniqueId).child("type"); 
     typ.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Log.d("LOGGING", "Entered"); 
       type = dataSnapshot.getValue().toString(); 

      } 
      @Override 
      public void onCancelled(DatabaseError e) { 
       Log.d("Error", e.getMessage()); 
      } 
     }); 
     //make a user locally in the model 
     if (type.equals("user")) { 
      Model.getInstance().setCurrentUser(new User(uniqueId, email, name, zip, phone)); 
     } else if (type.equals("worker")) { 
      Model.getInstance().setCurrentUser(new Worker(uniqueId, email, name, zip, phone)); 
     } else if (type.equals("manager")) { 
      Model.getInstance().setCurrentUser(new Manager(uniqueId, email, name, zip, phone)); 
     } else if (type.equals("admin")) { 
      Model.getInstance().setCurrentUser(new Administrator(uniqueId, email, name, zip, phone)); 
     } 
    } 

    /** 
    * @param requestCode The request code 
    * @param resultCode The result code 
    * @param data The intent which determines the response 
    * 
    */ 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == RC_SIGN_IN) { 
      IdpResponse response = IdpResponse.fromResultIntent(data); 

      // Successfully signed in 
      if (resultCode == ResultCodes.OK) { 
       String uniqueId = FirebaseAuth.getInstance().getCurrentUser().getUid(); 
       String email = FirebaseAuth.getInstance().getCurrentUser().getEmail(); 
       //final String displayName = FirebaseAuth.getInstance().getCurrentUser().getDisplayName(); 
       DatabaseReference UserRef = mUserDatabase.child(uniqueId); 
       UserRef.addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         Object userData = dataSnapshot.getValue(); 
         Intent intent; 
         if (userData == null) { 
          //mUserDatabase.child(uniqueId).child("email").setValue(email); 
          //mUserDatabase.child(uniqueId).child("name").setValue(displayName); 
          intent = new Intent(WelcomeActivity.this, CreateProfile.class); 
         } else { 
          //mUserDatabase.setValue(uniqueId); 
          //mUserDatabase.child("email").setValue(email); 
          setUser(); 
          intent = new Intent(WelcomeActivity.this, MainActivity.class); 
         } 
         startActivity(intent); 
         finish(); 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 
       Log.d("AUTH", auth.getCurrentUser().getEmail()); 

       Intent intent = new Intent(WelcomeActivity.this, MainActivity.class); 
       startActivity(intent); 
       finish(); 
      } 
     } 
    } 
} 

これは私のGradleファイルが使用addlistenerforsinglevalueevent

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.2" 
    defaultConfig { 
     applicationId "edu.gatech.cs2340.waterfall" 
     minSdkVersion 23 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     multiDexEnabled true; 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 

    compile 'com.android.support:appcompat-v7:25.1.1' 
    compile 'com.android.support:design:25.1.1' 
    compile 'com.firebaseui:firebase-ui-auth:1.1.1' 
    compile 'com.android.support:multidex:1.0.1' 
    compile 'com.google.firebase:firebase-auth:10.0.1' 
    compile 'com.google.firebase:firebase-database:10.0.1' 
    compile 'com.google.firebase:firebase-core:10.0.1' 
    compile 'com.android.support.constraint:constraint-layout:1.0.1' 
    testCompile 'junit:junit:4.12' 
} 
apply plugin: 'com.google.gms.google-services' 

答えて

4

`この方法を試してみてください私は、同じエラーが発生しました!あなたがここで無視しているのは、onDataChange()の非同期の性質であり、何も記録されない理由は、データの取得を終了する前にエラーがあるということです。あなたはOnDataChangeの(内部のコールバックメカニズムを実装する必要がこの)、このような修正するには:

public interface OnGetDataListener { 
    //make new interface for call back 
    void onSuccess(DataSnapshot dataSnapshot); 
    void onStart(); 
    void onFailure(); 
} 

その後に、スナップショットからデータを読み出すためにreadDataメソッドを作成し、このすべてがすることは時にするonSuccessメソッドを呼び出すですデータが読み込まれます。

public void readData(DatabaseReference ref, final OnGetDataListener listener) { 
    listener.onStart(); 
    ref.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      listener.onSuccess(dataSnapshot); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      listener.onFailure(); 
     } 
    }); 

} 

最後に、setUserメソッドで、onSuccessメソッドで行う必要があるすべてを実装します。このようなものはうまくいくと思う。

public void setUser(DatabaseReference ref) { 
     readData(ref, new OnGetDataListener() { 
      @Override 
      public void onSuccess(DataSnapshot dataSnapshot) { 
       //whatever you need to do with the data 
      } 
      @Override 
      public void onStart() { 
       //whatever you need to do onStart 
       Log.d("ONSTART", "Started"); 
      } 

      @Override 
      public void onFailure() { 

      } 
     }); 
    } 
+1

ありがとうございます。私は問題がそこにあった理由を理解する。この固定されたすべて!私はこれで何時間もやっていた! –

0

次のようになります。あなたがその特定のノードのdataScreenShot提供する場合onDataChangeMethodを実装します。

注:Firebaseのオフライン機能を使用している場合、keepSync(true)を使用することを忘れないでください。

+0

これはまさに私がやったことです。あなたはコードを見ていただけますか?具体的には、setUserメソッド。 –

+0

イベントをaddValueEventListenerに変更すると、それが入力された場合はおそらく私はその問題が分かっているか、そうでなければ再度分析する必要があります –

+0

上記のコメントに示されているように、それは匿名の内部クラスを持つことと同等ですか? –

1

setUser()に電話をした直後に、現在のアクティビティが完了している可能性があります。ファイヤーベースからの応答が返ってくると、コールバックがあるアクティビティは起動しません。現在のアクティビティに戻ると、現在のアクティビティを強制終了しないでください。それを積み重ねてください。

+0

お返事ありがとうございます。私はfinish()呼び出しの両方を削除し、前と同じエラーが発生しています。私の変数 "type"(私的静的String型)はまだnullであり、 "if(type.equals(" user "))でnullpointerexceptionを引き起こしています。なぜなら、onDataChangeで初期化されていないからです。 –

+0

"タイプ"変数を公開します。たぶん、キャストしようとすると、dataSnapshotはモデル内の変数にアクセスすることができず、それはnullpointer expを引き起こします。 'dataSnapshot.getValue()'で必要な正確なデータを取得してください。 – AtaerCaner

+0

同じエラーが発生しています。また、問題は私がログを持っているということです。dはonDataChangeの内側にありますが、onDataChangeは決して入力されないのでログに記録されることはありません! –

0

ValueEventListener postListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // Get Post object and use the values to update the UI 

      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       String value = postSnapshot.getValue(); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      // Getting Post failed, log a message 
      // [START_EXCLUDE] 
      Toast.makeText(ClassName.this, "Failed to load post.", 
        Toast.LENGTH_SHORT).show(); 
      // [END_EXCLUDE] 
     } 
    }; 
    mPostReference.addValueEventListener(postListener); 
    mPostListener = postListener;` 
+0

私は同じ結果を得ています。 onDataChangeが入力されていません:/ –

+0

OnCreateでmPostReferenceを開始し、onStartで上記のメソッドを呼び出し、データベースパスを確認してください。 –

関連する問題