Come salvare un elenco di stringhe che potrebbero diventare troppo grandi ma i vecchi dati non sono utili

7

Sto sviluppando un'applicazione che invia determinate notifiche all'utente come letto da un servizio esterno di sola lettura. L'utente potrebbe ignorare le notifiche e quelle non dovrebbero apparire di nuovo.

Non posso chiedere al server di darmi solo le voci più recenti della mia ultima query perché sono particolarmente interessato a un valore che cambia nel tempo. Devo dare una possibilità alle voci almeno per una settimana. Per questo motivo, le query al servizio potrebbero restituire dati che erano già stati recuperati in precedenza e ho bisogno di filtrare quelli già archiviati. Posso farlo guardando gli ID delle voci ricevute, che sembrano essere degli hash SHA.

Posso salvare quegli ID nelle Preferenze come id - > coppie booleane, o in un database SQLite, ma sicuramente raggiungeranno un certo limite prima o poi.

Inoltre, non ho davvero bisogno di controllare le voci più vecchie. Potrei mettere un limite rigido, diciamo, alle ultime 100 voci e questo dovrebbe essere più che sufficiente.

Come dovrei avvicinarmi allo smaltimento delle vecchie voci per assicurarmi di non superare i limiti?

EDIT: come richiesto, maggiori informazioni sul problema che potrebbe essere utile:

  • La mia query al momento ha il formato "le ultime 1000 voci, dalla più recente alla meno recente, se sono più recenti di 2 settimane". 1000 è un numero così alto che è effettivamente infinito, ai fini della mia applicazione. 2 settimane è un intervallo di tempo così lungo che l'utente non dovrebbe più essere informato su tali informazioni, poiché è altamente improbabile che diventi rilevante per quel momento.

  • Tutte le voci hanno un timestamp "creato". Hanno anche un timestamp "aggiornato", che, se esiste, dovrebbe essere considerato come la data "creata" ai fini della mia domanda. Non mi aspetto che le risposte tengano conto di questo aspetto tecnico, però.

  • Tutte le voci hanno un "coefficiente di importanza", che è il valore che sto monitorando. Notifica all'utente solo le voci con questo coefficiente superiore a una soglia impostata. Poiché questo valore cambia nel tempo, non posso semplicemente ignorare le voci che ho già recuperato in precedenza e che ho trovato non pertinente. Le modifiche in questo valore non influiscono sul campo "aggiornato".

  • Se l'utente chiude la notifica di una voce, la sua notifica dovrebbe essere filtrata la prossima volta che si verifica una query. Confrontare gli ID è sufficiente per questo.

posta Pablo Almeida 20.03.2016 - 14:21
fonte

4 risposte

3

Solo un'idea, forse ho frainteso alcuni parametri del problema. Offro comunque la mia soluzione, come inizio per lavorare verso qualcosa di funzionale.

Al momento del recupero:

  • recupera dalle voci del database di sola lettura solo o più recenti rispetto all'ultima query o più recente di 1-2 settimane
  • filtra le voci che sono già state scartate confrontando i loro ID con quelli che hai salvato nel tuo database SQLite

Inoltre, se hai paura di esaurire lo spazio nel tuo database SQLite, o comunque vuoi dimenticare le vecchie notifiche respinte:

  • una volta alla settimana, controlla quali delle voci del tuo database SQLite hanno più di 2 settimane (esegui un controllo incrociato con il database di sola lettura o semplicemente salvando la data di ingresso nel database SQLite) ed elimina li
risposta data 24.03.2016 - 19:15
fonte
1

Utilizzando complemento operazione dalla teoria degli insiemi. E ipotizzando notifiche recenti limitate a 100.

Set<Notification> updateNotifications(Set<Notification> persisted, Set<Notification> recent) {
    Set<Notification> newNotifications = complement(recent, persisted);
    save(newNotifications);
    persisted = persisted.addAll(newNotifications);

    if (persisted.size() <= 100) {
        return persisted;
    }

    Set<Notification> obsoleteNotifications = complement(persisted, recent);
    delete(obsoleteNotifications);
    persisted = persisted.removeAll(obsoleteNotifications);

    return persisted;
}
class Notification {
    /* Fields provided by the service */
    boolean dismissed;
}

Notification della classe presumibilmente deserializzata da JSON e dismissed impostata su false per impostazione predefinita. Dopo ogni chiamata di recupero del servizio updateNotifications per salvare la nuova notifica ed eliminare quelle obsolete. Vengono salvate solo le nuove notifiche, quindi viene mantenuto il flag respinto sulle notifiche precedentemente persistenti.

Con un timestamp puoi implementare complement e delete in modo più efficiente.

    
risposta data 24.03.2016 - 21:06
fonte
1

Scrivi una classe di notifica o una struttura con proprietà che coprono tutti i campi nel tuo set di risultati più una proprietà "Licenziato" extra con un valore predefinito di falso.

All'avvio dell'applicazione leggere l'elenco ordinato degli oggetti di notifica (che potrebbe essere vuoto la prima volta). Dovrebbe essere ordinato per data / ora. Abbinalo ai tuoi limiti. Quindi periodicamente

  • esegui la tua query.
  • passa in rassegna i record nel set di risultati, per ciascuno:

    • cercare l'oggetto con lo stesso id;
    • se la proprietà Dismissed è true, continua / next. Altrimenti crea un oggetto di notifica per il record e aggiungilo alla tua lista ordinata.
  • Mostra gli oggetti non ancora eliminati nella tua raccolta all'utente. Consenti all'utente di leggere e chiudere un oggetto. Quando lo respinge, imposta la proprietà Dismissed su true e rimuovi la notifica dalla vista.

Alla chiusura dell'applicazione, continua la raccolta delle notifiche.

Se la vista di notifica è aperta e il poller entra in azione, è necessario saltare un round o aggiornare la vista dopo che la raccolta di notifiche è stata aggiornata.

    
risposta data 24.03.2016 - 23:49
fonte
1

In base a ciò che hai menzionato e secondo quanto ho capito,

  1. Recupera i risultati dal server.
  2. Aggiorna record se la voce esiste altrimenti inserisci.
  3. Imposta una data di scadenza del record (aggiungi due settimane alla data creata o aggiornata, a seconda di qual è il valore più alto / a seconda del tuo requisito).
  4. Elimina le voci scadute.

E quando l'utente ha eliminato la notifica per una voce, è possibile impostare un flag sul record.

    
risposta data 31.03.2016 - 02:36
fonte

Leggi altre domande sui tag