способ удалить начало чата - PullRequest
0 голосов
/ 15 января 2019

Я хочу создать приложение для чата, использующее базу данных Firebase Realtime, где многие люди могут общаться одновременно. Все сообщения должны храниться там:

->1
   ->user
   ->message

->2
   ->user
   ->message
...

Но если количество сообщений становится слишком большим (например, 200), последние 10 должны быть удалены.

Итак, что я пробовал (но, очевидно, это не лучшее решение), это следующее: Вы можете позволить каждому телефону делать это, что выглядит следующим образом:

myReference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                if(dataSnapshot.getChildrenCount() > 200){
                    //Here would be the code to delete it
                }
            }

            @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) {

            }
        });

1 Ответ

0 голосов
/ 15 января 2019

Добро пожаловать в переполнение стека!

Функционально ваш подход к тому, чтобы клиенты позаботились об управлении сообщениями, вероятно, сработал бы, но, как вы подозреваете, это не лучшее решение. С одной стороны, это означает, что клиенты должны быть авторизованы для удаления / изменения всех сообщений, независимо от того, какой пользователь отправил их (в конце концов, самые старые сообщения могли быть опубликованы любым пользователем, в конце концов). Даже не зная вашего точного варианта использования, я сомневаюсь, что вы хотите позволить одному пользователю удалять сообщения, отправленные кем-то другим.

Вместо этого, функциональность, которую вы описываете, звучит так, как будто она должна быть обязанностью сервера, а не клиента.

Для этого вы можете использовать Облачные функции Firebase (в частности, через База данных реального времени запускает , скорее всего), что должно позволить вам эффективно выполнять тот же код "onChildAdded", который вы описано, но на сервере. Таким образом, вам нужно только авторизовать сервер для изменения всех сообщений, и клиент не должен быть вовлечен.

(Примечание. Хотя с вашей схемы это выглядит не так, но если вы действительно хотели сохранить только 200 самых последних сообщений на пользователя , авторизация была бы менее важной. Тем не менее, Вероятно, было бы хорошей идеей возложить на себя ответственность такого рода на стороне сервера, хотя бы потому, что это позволяет вам изменять логику в любое время без необходимости развертывания новой версии для ваших клиентов. В общем, этот вид «Обслуживание данных» просто лучше подходит как обязанность сервера.)

...