2016-07-09 26 views
21
  1. C'è un modo per cancellare i dati memorizzati nella persistenza Firebase Database abilitata tramite setPersistenceEnabled(true)?
  2. O eventualmente impedire l'accesso in lettura ai dati degli utenti precedentemente memorizzati sul dispositivo?
  3. E ulteriore domanda: esiste un modo per verificare se alcuni dati sono in attesa di sincronizzazione?

Nella mia app voglio cancellare db quando l'utente si disconnette e conferma che le modifiche non sincronizzate verranno rimosse. Questa applicazione sarà utilizzato su tablet da molte persone, e ci saranno molti dati memorizzati per utente, in modo da voglio cancellare i dati non necessari memorizzati sul dispositivo a:Cancella persistenza firebase dopo il logout

  • utilizzo dello storage strizzacervelli
  • prevenire persone non autorizzate di dati agli utenti di leggere

Si tratta di una falla di sicurezza in quanto qualsiasi utente, indipendentemente dal fatto che è firmato o no, ha accesso in lettura a tutti i dati precedentemente scaricati! Fortunatamente non abbiamo accesso in scrittura lì.

ho cercato di cancellare db da solo, sia in modalità offline e online, ma i dati ancora persistono sul dispositivo:

// 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(); 

esempio struttura dei dati:

{ 
    "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" 
     } 
    } 
    } 
} 

mie regole:

{ 
    "rules": { 
    ".read": "false", 
    ".write": "false", 
    "someList": { 
     "$uid": { 
     ".read": "$uid === auth.uid", 
     ".write": "$uid === auth.uid" 
     } 
    } 
    } 
} 
+0

hai provato 'mRef.keepSynced (false);' –

+0

@SahajRana sfortunatamente aggiungendo 'keepSynced (false)' in qualsiasi luogo non cambia nulla. Solo quando cancello l'ultimo 'db.goOnline()' allora non posso davvero leggere i dati utente precedenti. Ma posso scrivere e leggere i nuovi dati come utente "disconnesso". E dopo aver effettuato il login quando chiamo 'db.goOnline()' (per avere db in sync) cancella tutti i miei vecchi dati sul backend e allo stesso addome aggiunge nuovi dati aggiunti come utente "disconnesso". – sosite

+0

In realtà quando si imposta 'setPersistenceEnabled (true)' firebase memorizza i dati in forma cache sul dispositivo in modo che possa mostrare i dati quando si è offline –

risposta

9

Sfortunatamente non esiste un modo supportato per cancellare la cache di persistenza. Potresti provare a cancellare manualmente il database SQLite utilizzato dal database Firebase (dovrebbe trovarsi sotto /databases/ nella cartella dei dati dell'app), ma dovresti farlo prima di inizializzare il database Firebase, quindi dovrai forzare il riavvio dell'app dopo firmando qualcuno o simili.

Per sapere se ci sono "dati in attesa di sincronizzazione", supponendo che si stia parlando di scritture, l'unico modo è di allegare CompletionListeners ad ogni operazione di scrittura che si esegue e attendere che vengano completate.

Entrambe queste sono le cose che vorremmo migliorare nelle versioni future dell'SDK di Firebase Database.

+0

Un dato in attesa di sincronizzazione è quello che ci piacerebbe vedere .. – kirtan403

+0

@ Michael Legenbauer - Quindi ... c'è qualche progresso con esso? – sosite

+5

@ michael-lehenbauer Qualche nuovo progresso su questo? A causa delle limitazioni di Firebase di perdere le modifiche in sospeso quando l'app viene terminata offline, sto vedendo la cache locale uscire fuori sincrono con il database senza un modo apparente per risolverlo. Un modo per svuotare la cache sarebbe un buon ripiego. –

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

source

0

è possibile utilizzare keepSync(true). sincronizzerà i nuovi dati ogni volta.