前提・実現したいこと
Firebaseを使ったAndroidアプリの開発において、CloudFirestoreからデータを取得し、そのデータをreturnで返す関数を作成したいです。
発生している問題・エラーメッセージ
発生している問題は、returnで返す変数にCloudFirestoreから取得した値が上手く格納されないことです。
具体的な状況は「試したこと」の欄に記入してあります。
エラーメッセージは出ていません。
該当のソースコード
Java
1//指定のドキュメントリファレンスの指定のフィールドのデータを返す関数 (本題) 2 public Object getFirestoreData (DocumentReference docRef, final String field) { 3 final Object[] data = new Object[1]; 4 docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { 5 @Override 6 public void onComplete(@NonNull Task<DocumentSnapshot> task) { 7 if (task.isSuccessful()) { 8 DocumentSnapshot document = task.getResult(); 9 if (document.exists()) { 10 data[0] = document.get(field); 11 } else { 12 data[0] = "no_data"; 13 } 14 } else { 15 data[0] = "failure"; 16 } 17 } 18 }); 19 return data[0]; 20 } 21 22 23//取得したデータが正常にdata[0]に格納されていることが確認できた関数 (試したこと1) 24 public void setFirestoreData (DocumentReference docRef, final String field, final TextView text_view) { 25 final Object[] data = new Object[1]; 26 final String[] str = new String[1]; 27 docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { 28 @Override 29 public void onComplete(@NonNull Task<DocumentSnapshot> task) { 30 if (task.isSuccessful()) { 31 DocumentSnapshot document = task.getResult(); 32 if (document.exists()) { 33 data[0] = document.get(field); 34 } else { 35 data[0] = "no_data"; 36 } 37 } else { 38 data[0] = "failure"; 39 } 40 str[0] = data[0].toString(); 41 text_view.setText(str[0]); 42 } 43 }); 44 } 45 46 47//onComplete外ではdata[0]==nullが確認できた関数 (試したこと2) 48 public void setFirestoreData (DocumentReference docRef, final String field, final TextView text_view) { 49 final Object[] data = new Object[1]; 50 final String[] str = new String[1]; 51 docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { 52 @Override 53 public void onComplete(@NonNull Task<DocumentSnapshot> task) { 54 if (task.isSuccessful()) { 55 DocumentSnapshot document = task.getResult(); 56 if (document.exists()) { 57 data[0] = document.get(field); 58 } else { 59 data[0] = "no_data"; 60 } 61 } else { 62 data[0] = "failure"; 63 } 64 } 65 }); 66 if (data[0] != null) { 67 str[0] = data[0].toString(); 68 } else { 69 str[0] = "NULL"; 70 } 71 text_view.setText(str[0]); 72 }
試したこと
一度、関数を戻り値の無い形にし、複数の場所でdata[0]をString型に変換、TextViewにsetして確認してみたところ、「public void onComplete」の中では取得したデータが正常にdata[0]に格納されていましたが、「public void onComplete」の外ではdata[0]がnullになっていました。
補足情報(FW/ツールのバージョンなど)
Android Studio 4.0.1,
API 29,
Android 10.0
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。