Подтвердить что ты не робот

Устойчивость ясного огня после выхода из системы

  • Есть ли способ очистить данные, хранящиеся в базе данных Firebase, через setPersistenceEnabled(true)?
  • Или в конечном итоге предотвратить доступ к чтению ранее сохраненных данных пользователей на устройстве?
  • И дополнительный вопрос - есть ли способ проверить, ждут ли какие-либо данные для синхронизации?

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

  • сокращение использования хранилища
  • Предотвращение несанкционированного чтения пользователями данных.

Это ошибка безопасности, потому что любой пользователь, независимо от того, подписан ли он или нет, имеет доступ для чтения ко всем ранее загруженным данным! К счастью, у нас нет доступа для записи.

Я попытался очистить db самостоятельно, как в автономном режиме, так и в режиме онлайн, но данные все еще сохраняются на устройстве:

// first clear all data on my own
FirebaseDatabase db = FirebaseDatabase.getInstance();
db.goOffline(); // even when I clear db in online mode data persist on mobile device
db.getReference().setValue(null);

// and then logout
FirebaseAuth.getInstance().signOut();
db.goOnline();

например, структура данных:

{
  "someList": {
    "userId1": {
      "itemId11": {
        "name": "name 11"
      },
      "itemId12": {
        "name": "name 12"
      },
      ...
      "itemId1N": {
        "name": "name 1N"
      }
    }
    "userId2": {
      "itemId21": {
        "name": "name 21"
      },
      "itemId22": {
        "name": "name 22"
      },
      ...
      "itemId2N": {
        "name": "name 2N"
      }
    }
  }
}

мои правила:

{
  "rules": {
    ".read": "false",
    ".write": "false",
    "someList": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}
4b9b3361

Ответ 1

К сожалению, нет поддерживаемого способа очистки кеша персистентности. Вы можете попытаться вручную удалить базу данных SQLite, используемую в базе данных Firebase (она должна находиться под /databases/ в папке с данными приложения), но вам нужно будет сделать это до инициализации базы данных Firebase, поэтому вам придется принудительно заставить приложение перезагрузитесь после подписания кого-то или подобного.

Относительно знать, есть ли "данные, ожидающие синхронизации", предполагая, что вы говорите о записи, единственный способ - присоединить CompletionListeners к каждой операции записи, которую вы выполняете, и дождаться их завершения.

Обе эти вещи мы хотели бы улучшить в будущих версиях SDK Firebase Database.

Ответ 2

вы можете использовать keepSync(true). он будет синхронизировать новые данные каждый раз.

Ответ 3

    if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
        ((ActivityManager) getContext().getSystemService(ACTIVITY_SERVICE))
                .clearApplicationUserData();
    }

источник