Я пытаюсь получить некоторые данные из Firebase, но это не работает для одного из моих узлов.
Обратите внимание, что узел UnverifiedEmployees работает нормально, но узел «Компании» не работает. Я могу видеть журнал ПРЯМО ПЕРЕД прослушивателем событий, но внутри него ничего не печатается. Я имею в виду эту область:
public void addDataToFirebase() {
Log.i("BEFORE", "BEFORE COMPANIES REF");
companiesRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.i("COMPANIESREF", "INSIDE COMPANIES REF ONDATACHANGE");
Я пробовал это на другом телефоне. Пробовал через Wi-Fi и 4G. Я также пытался войти в систему с другим пользователем. Я также пытался удалить приложение со своего телефона и переустановить. Я пробовал писать разные реализации addListener. Я также пытался найти это, но не нашел многого (например, Android Firebase addListenerForSingleValueEvent не вызывается ) ( Firebase Android addListenerForSingleValueEvent иногда не возвращает данные )
База данных: (если UserID существует, возьмите CompanyID, к которой он относится)

Весь код: AddEmployeeActivity.java:
public class AddEmployeeActivity extends Activity {
private EditText firstNameET, lastNameET, phoneNumberET, emailET, ssnET;
private ImageView checkmarkImage;
private static FirebaseUser currentUser;
private static final String TAG = "RealtimeDB";
private FirebaseDatabase database;
private DatabaseReference unverifiedRef, companiesRef;
String emailKey, ssnKey, phoneKey, companyId;
int num;
private FirebaseMethods firebaseMethods;
private Context mContext;
ArrayList<EmployeeUser> myListItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register_addemployees);
mContext = AddEmployeeActivity.this;
firstNameET = (EditText) findViewById(R.id.firstNameET);
lastNameET = (EditText) findViewById(R.id.lastNameET);
phoneNumberET = (EditText) findViewById(R.id.phoneNumberET);
emailET = (EditText) findViewById(R.id.emailET);
ssnET = (EditText) findViewById(R.id.ssnET);
checkmarkImage = (ImageView) findViewById(R.id.checkmarkImage);
database = FirebaseDatabase.getInstance();
unverifiedRef = database.getReference("/Unverified Employees");
companiesRef = database.getReference("/Companies");
currentUser =
FirebaseAuth.getInstance().getCurrentUser();
checkmarkImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String email = emailET.getText().toString().trim();
final String ssn = ssnET.getText().toString().trim();
final String phone = phoneNumberET.getText().toString().trim();
//Add EditText info to Firebase UnverifiedEmployees Node
addDataToFirebase();
}
});
} //End of ONCREATE
public void addDataToFirebase() {
Log.i("BEFORE", "BEFORE COMPANIES REF");
//companiesRef.addValueEventListener(new ValueEventListener(){
companiesRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.i("COMPANIESREF", "INSIDE COMPANIES REF ONDATACHANGE");
EmployeeUser user = new EmployeeUser();
for (DataSnapshot ds: dataSnapshot.getChildren()) {
for (DataSnapshot ds2: ds.getChildren()) {
for (DataSnapshot ds3: ds2.getChildren()) {
for (DataSnapshot ds4: ds3.getChildren()) {
for (DataSnapshot ds5: ds4.getChildren()) {
Log.i(TAG, "checkIfUsernameExists: datasnapshot: " + ds5);
//user.setCompanyId(ds5.getValue(EmployeeUser.class).getCompanyId());
user.setCompanyId(ds5.getValue(String.class));
Log.i(TAG, "checkIfUsernameExists: ID: " + user.getCompanyId());
//callback.gotDataSnapshot(dataSnapshot);
if (user.getCompanyId()!= null) {
companyId = user.getCompanyId();
}
}
}
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.i("Cancelled", "In onCancelled: " + databaseError);
}
//};
}); //END OF ADDLISTENER
// companiesRef.addListenerForSingleValueEvent(eventListener);
emailKey = unverifiedRef.child(currentUser.getUid()).push().getKey();
unverifiedRef.child(currentUser.getUid()).child(emailKey).child("emailAddress").setValue(emailET.getText().toString(), completionListener);
Log.i("getKey EMAIL", emailKey);
ssnKey = unverifiedRef.child(currentUser.getUid()).push().getKey();
unverifiedRef.child(currentUser.getUid()).child(ssnKey).child("socialSecurityNumber").setValue(ssnET.getText().toString(), completionListener);
unverifiedRef.child(currentUser.getUid()).child(ssnKey).child("CompanyID").setValue(companyId, completionListener);
Log.i("getKey SSN", ssnKey);
Log.i("get COMPANY ID", companyId);
phoneKey = unverifiedRef.child(currentUser.getUid()).push().getKey();
unverifiedRef.child(currentUser.getUid()).child(phoneKey).child("phoneNumber").setValue(phoneNumberET.getText().toString(), completionListener);
Log.i("getKey Phone", phoneKey);
}
Решение проблемы
Вы не можете достичь этого тем способом, которым вы это делаете. Невозможно получить родителя на основе значения одного из его дочерних элементов. Другими словами, вы не можете получить значение, L4bs8bH5...если этот идентификатор RC9zI1...существует под ним. Чтобы решить эту проблему, вам нужно рассмотреть возможность использования денормализации, что является обычной практикой, когда речь идет о Firebase. Это означает, что вам нужно дублировать данные, чтобы получить эти результаты. Для этого я рекомендую вам посмотреть этот учебник, Денормализация — это нормально для базы данных Firebase, для лучшего понимания.
Таким образом, в этом случае вам обычно следует подумать о расширении вашей структуры данных, чтобы разрешить обратный поиск. Например, в вашем сценарии я бы добавил список компаний под идентификатором пользователя. Сделав это, вы сможете запросить все компании, принадлежащие одному пользователю, если он явно существует.
Комментариев нет:
Отправить комментарий