получить правильные данные для конкретного пользователя из Firebase - PullRequest
0 голосов
/ 29 августа 2018

У меня есть приложение чата, и я пытаюсь развернуть группы чатов, частью которых является зарегистрированный пользователь. Я изо всех сил пытаюсь получить правильные группы. Вот моя структура базы огня . Все участники находятся под дочерним элементом «члены» внутри группы. Я отображаю группы в режиме просмотра, который работает нормально. Это, конечно, работает для любого пользователя, который входит в систему, и пользователь может входить во многие разные группы. Я надеюсь, что вы поняли идею и можете мне помочь. Спасибо

Мой код:

private FirebaseDatabase mDatabase;
private DatabaseReference mDatabaseReference;
private FirebaseAuth mAuth;
private FirebaseUser mUser;
private String projectId;
private List<DataService> grouplist;
private RecyclerAdapter recyclerAdapter;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAuth = FirebaseAuth.getInstance();
    mUser = mAuth.getCurrentUser();
    mDatabaseReference = mDatabase.getReference().child("groups");

    mDatabase = FirebaseDatabase.getInstance();
    mDatabaseReference.keepSynced(true);

    grouplist = new ArrayList<>();
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
}

protected void onStart() {
    super.onStart();
    grouplist.clear();

        mDatabaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            DataService groupData = dataSnapshot.getValue(DataService.class);

            grouplist.add(groupData);

            recyclerAdapter = new RecyclerAdapter(Main.this, grouplist);
            recyclerView.setAdapter(recyclerAdapter);
            recyclerAdapter.notifyDataSetChanged();

        }


        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

DataService.java

public class DataService {
public String subject;
public String projectName;
public String endDate;
public String members;
public String userid;
public String creationDate;
public String dropbox;
public String evernote;
public String googleDocs;

public DataService() {
}


public DataService(String subject, String projectName, String endDate, String members, String userid, String creationDate, String dropbox, String evernote, String googleDocs) {
    this.subject = subject;
    this.projectName = projectName;
    this.endDate = endDate;
    this.members = members;
    this.userid = userid;
    this.creationDate = creationDate;
    this.dropbox = dropbox;
    this.evernote = evernote;
    this.googleDocs = googleDocs;
}

public String getCreationDate() {
    return creationDate;
}

public void setCreationDate(String creationDate) {
    this.creationDate = creationDate;
}

public String getDropbox() {
    return dropbox;
}

public void setDropbox(String dropbox) {
    this.dropbox = dropbox;
}

public String getEvernote() {
    return evernote;
}

public void setEvernote(String evernote) {
    this.evernote = evernote;
}

public String getGoogleDocs() {
    return googleDocs;
}

public void setGoogleDocs(String googleDocs) {
    this.googleDocs = googleDocs;
}

public String getSubject() {
    return subject;
}

public void setSubject(String subject) {
    this.subject = subject;
}

public String getProjectName() {
    return projectName;
}

public void setProjectName(String projectName) {
    this.projectName = projectName;
}

public String getEndDate() {
    return endDate;
}

public void setEndDate(String endDate) {
    this.endDate = endDate;
}

public String getmembers() {
    return members;
}

public void setmembers(String members) {
    this.members = members;
}

public String getUserid() {
    return userid;
}

public void setUserid(String userid) {
    this.userid = userid;
}
}

1 Ответ

0 голосов
/ 30 августа 2018

Используя фактическую структуру базы данных, вы не можете получить все группы, в которые входит пользователь, если вы не внесете некоторые изменения в свою базу данных. В вашем случае вам следует рассмотреть возможность дополнения структуры базы данных, чтобы разрешить обратный поиск путем создания другого узла с именем groups под каждым объектом пользователя, в который вы должны добавить все идентификаторы группы, из которых состоит пользователь. Таким образом, ваша структура базы данных должна выглядеть следующим образом:

Firebase-root
   |
   --- users
         |
         --- userId
               |
               --- groups
                     |
                     --- groupIdOne: true
                     |
                     --- groupIdTwo: true

Чтобы получить все группы, в которые входит пользователь, просто подключите прослушиватель к узлу groups, и есть все группы, которые вам нужны.

Но вы будете думать, зачем это делать? Зачем дублировать данные? Что ж, нет проблем с дублированием данных, когда речь идет о Firebase. Это довольно распространенная практика, которая называется denormalization, и для этого я рекомендую вам посмотреть это видео, Денормализация нормальная с базой данных Firebase .

Когда вы дублируете данные, нужно помнить одну вещь. Точно так же, как вы добавляете данные, вы должны поддерживать их. Другими словами, если вы хотите обновить / обнаружить элемент, вы должны делать это в каждом месте, где он существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...