Offline режим в firebase

278
04 мая 2017, 12:58

Дано: Приложение работающее с firebase.

Проблема: Приложение падает при первом запуске если нет интернета (т.к. не успевает кэшировать базу с интернета). Поясню более подробнее приложение реализовано так, что при первом запуске в базе создается анонимный пользователь и если после отключить интернет, то приложение работает без проблем, но если это первый запуск и нет интернета падает с ошибкой NPE (т.к. user null, что и так понятно, нет инета не может зарегистрироваться анонимно)

Вопрос: Как можно реализовать поддержку оффлайн режима при первом запуске приложения и обязательно отсутствии интернета

Дополнительно: это все делал как написано в гайдах

FirebaseDatabase.getInstance().setPersistenceEnabled(true);
DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("scores");
scoresRef.keepSynced(true);
Answer 1

Решил проблему следующим образом:

  1. При первом запуске без интернета user null (т.к. нет интернета), создаю своего локального пользователя

    @NonNull
    private String getUid() {
    String userID;
    if (user == null) {
        userID = UUID.randomUUID().toString();
    } else {
        userID = user.getUid();
    }
    Log.d(LOG_TAG, "userID = " + userID);
    return userID;
    }
  2. При последующих запусках приложения проверяю, если есть интернет и первый запуск был без интернета, то происходит анонимная авторизация и копирование локальных данных в бд, после этого удаляю старую бд скопировав все данные из нее в новую

    public void moveFirebaseRecord(final DatabaseReference fromPath, final DatabaseReference toPath) {
    fromPath.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            toPath.setValue(dataSnapshot.getValue(), new DatabaseReference.CompletionListener() {
                @Override
                public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
                    if (databaseError != null) {
                        Log.d(LOG_TAG, "moveFirebaseRecord() failed. firebaseError = " + databaseError);
                    } else {
                        fromPath.removeValue();// deleteAll from oldDB 
                        Log.d(LOG_TAG, "moveFirebaseRecord() Great success!");
                    }
                }
            });
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });

    }

READ ALSO
Как вывести динамическую таблицу из БД?

Как вывести динамическую таблицу из БД?

Интересует как вывести динамическую таблицу из БД на GUI - формуИспользовал интерфейс "AbstractTableModel"

349
JsonMappingException: Multiple back-reference properties with name 'defaultReference'

JsonMappingException: Multiple back-reference properties with name 'defaultReference'

Подскажите как можно передать json с фронта в spring MVC контроллер: класс:

511
Что внутри конструктора по умолчанию?

Что внутри конструктора по умолчанию?

Допустим если мы объявим конструктор, то он будет возвращать нам некоторую информацию, и мы будем знать какую, а если этого не делать?

315