2016-11-17 19 views
1

Итак, у меня есть простое приложение для андроида firebase, которое я собираюсь обслуживать для разных пользователей. Пользователь регистрируется и при создании их Uid хранится в пользовательской таблице вместе с записью UserInformation под их Uid со значениями «UserType» и «IsCurrentlyTracking». Пользователь подписывается, приводится в профиль, в котором они могут нажать кнопку, чтобы продолжить работу через приложение. Вот моя таблица: Android - Firebase; при входе в систему, извлечении данных (многоуровневых) и перенаправлении этого пользователя на основе этих данных

При нажатии продолжается данные UserInformation извлекаются. Исходя из этих данных, они перенаправляются на другую деятельность. Вместо того, чтобы выполнять вышеупомянутое, приложение останавливается/падает.

Вот код/​​метод, который перенаправляет пользователя:

public void userRedirect(){ 

    firebaseAuth = FirebaseAuth.getInstance(); 
    user = firebaseAuth.getCurrentUser(); 

    final FirebaseDatabase database = FirebaseDatabase.getInstance(); 

    Query q = database.getReference("Users/" + user.getUid() + "/UserInformation"); 

    q.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) { 
       UserInformation uI = dataSnapshot.getValue(UserInformation.class); 
       int userType = uI.getUserType(); 
       boolean ICT = uI.getTrackingStatus(); 

       if ((userType == 1) && (!ICT)) { 

        finish(); 
        startActivity(new Intent(ProfileActivity.this, AllocationActivity.class)); 
       } 
      } 
     } 

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

я был в состоянии, прежде чем извлекать данные, хотя информация не хранится в таблице «Users» (только под UID пользователя) , и UserInformation не сходила с UiD.

Для некоторых дополнительных условиях, вот мой пользовательский класс:

public int UserType; 
public boolean IsCurrentlyTracking; 

public UserInformation(int userType, boolean IsCurrentlyTracking){ 
    this.UserType = userType; 
    this.IsCurrentlyTracking = IsCurrentlyTracking; 
} 

public int getUserType() 
{ 
    return UserType; 
} 

public boolean getTrackingStatus() 
{ 
    return IsCurrentlyTracking; 
} 

Любые идеи о том, где я мог бы быть неправильно? Спасибо заранее.

ответ

1

Я предлагаю вам использовать FirebaseUI для аутентификации и получить ссылку на uid. Я также предлагаю вам не использовать «+» для конкатенации путей Firebase. Попробуйте вместо этого:

private DatabaseReference databaseReference; 

... 

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child(FirebaseAuth 
       .getInstance().getCurrentUser().getUid()).getRef(); 

и добавить слушателя, как это:

listener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
       // handle UserInformation here 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 

databaseReference.addValueEventListener(listener); 

Поэтому я предпочитаю отделяя его вместо перекрывая его внутри метода является то, что я могу сделать следующее OnDestroy:

@Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     databaseReference.removeEventListener(listener); 
    } 

Сохранение DatabaseReference и прослушивателя в качестве переменных-членов делает это проще.

Кроме того, не забудьте установить соответствующие Firebase правила для упрочнения доступа пользователей только к их данным:

{ 
    "rules": { 
    "$uid": { 
     ".write": "$uid === auth.uid", 
     ".read": "$uid === auth.uid", 
    } 
    } 
} 

Для более полного примера, проверьте список задач приложения я сделал, который использует ту же организацию базы данных образец here. Надеюсь, я был в состоянии помочь, не стесняйтесь комментировать, если у вас есть другие вопросы или если что-то неясно.

+2

Благодарим за ответ Faraz. Я буду реструктурировать и посмотреть, как я себя чувствую. Кроме того, спасибо за упрощение доступа в правилах базы данных. –

 Смежные вопросы

  • Нет связанных вопросов^_^