Firebase offline sync => можно ли использовать условие для синхронизации?ANDROID - PullRequest
0 голосов
/ 11 марта 2019

Я использую базу данных Firebase в реальном времени.

Я установил: "FirebaseDatabase.getInstance (). SetPersistenceEnabled (true);"

Так хорошо, когда я в автономном режиме, вседанные загружаются так же, как я был онлайн.

Но у меня есть несколько вопросов.

  1. В моем приложении есть чат-группа с несколькими людьми.Давайте предположим, что кто-то в группе и не в сети.Он пишет, что он хочет в чате, и сообщения будут отправлены, когда он станет онлайн.Но пока он не в сети, кто-то выгоняет его из группы.Как мне сообщить firebase:

    if (the user still belongs to the group)
    {
        sync messages
    }
    else
    {
        don't sync messages
    }
    

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

  2. Давайте представим, что в моем чате 50 сообщений.Пока я не в сети, я получаю 5 сообщений.Когда я вернусь в онлайн, будет ли повторно загружено 55 сообщений или только 5 дополнительных сообщений?

Я просто пытаюсь выяснить, будет ли синхронизация с базой данных стоить мне много данных или нет.

РЕДАКТИРОВАТЬ

Здесьэто способ получения данных из чата:

public void retrievedata () {

UserMessageRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) /**** HERE IS THE PROBLEM***/
    {

        if (dataSnapshot.exists()) {
            DisplayMessages(dataSnapshot);
        }

    }

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

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

    }

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


    }

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

    }
});

} // функция для извлечения сообщений

private void DisplayMessages (DataSnapshot dataSnapshot){Iterator iterator = dataSnapshot.getChildren (). Iterator ();

    String chatImage = (String) ((DataSnapshot) iterator.next()).getValue();
    String chatMessage = (String) ((DataSnapshot) iterator.next()).getValue();
    String nID = (String) ((DataSnapshot) iterator.next()).getValue();
    String chatTime = (String) ((DataSnapshot) iterator.next()).getValue().toString();



    ListOfChats.add(new ChatClass(nID, chatMessage, chatTime, chatImage));



    adapter.notifyDataSetChanged();

} Теперь вот проблема.

Если я в автономном режиме и захожу в чат, сообщениятолько что извлеченный с диска, хорошо работает нормально.

НО Если я выхожу в сеть и получаю 2 новых сообщения: вместо вызова onChildAdded для 2 новостных сообщений, он загружает ВСЕ сообщения и затем вызывает onChildAdded с помощьюстарый ребенок и ребенок 2 новостей.Что я хочу, так это чтобы 2 новостных сообщения были добавлены в локальный файл json на моем телефоне и что каждый не загружается каждый раз, когда я открываю сохранение.

Итак, с базой данных Firebase размером около 30 КБ я получил 5-10 МБ загрузок каждый день, даже если я добавлю 2 КБ в день в день ... (Это для университетского проекта, так что сейчас мы как 2 пользователя)

Так есть ли решение для этого (firebase просто обновитеjson файл в локальную базу данных, не загружая ничего) или мне нужно сделать свою собственную базу данных SQL и создать интеллектуальный адаптер синхронизации?

Я уверен, что firebase, должно быть, сделал что-то умное с этим.

1 Ответ

0 голосов
/ 11 марта 2019

Вызов FirebaseDatabase.getInstance().setPersistenceEnabled(true) просто гарантирует, что недавно полученные данные кэшируются на диске. Не включает автоматическую синхронизацию данных.

Чтобы включить автоматическую синхронизацию узла, вы можете вызвать keepSynced(true) по ссылке на этот узел.

Когда клиент Firebase находит, что у него уже есть данные для ссылки, к которой он подключает прослушиватель, он хэширует локальные данные и отправляет полученные хеши на сервер. Затем сервер отправляет обратно данные, необходимые для обновления версии данных клиента. Обычно это намного меньше данных, чем полный набор данных.

Также смотрите мой ответ здесь: Как клиент Firebase узнает, какие данные синхронизировать?

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