2013-05-17 14 views
5

Sto lavorando su un'app per Android che viene caricata in un elenco di studenti da visualizzare in un'attività basata su elenchi. Ci sono due componenti per l'app. C'è un server che risponde tramite xml con l'elenco degli studenti attivi correnti e un database sull'app end che memorizza questi studenti con alcuni dettagli (nome, età, ecc.). Vorrei un modo per sincronizzare queste due origini dati. All'avvio dell'app, vorrei verificare l'xml per vedere se gli studenti sul server sono stati aggiunti/eliminati e aggiornare di conseguenza il db.Memorizzazione e confronto di oggetti da un database

Analizzerei l'elenco xml in un oggetto studente all'accesso. C'è un modo per memorizzare/recuperare un intero oggetto in un db supportato da Android in modo da poter fare un confronto diretto per vedere cosa aggiornare/eliminare? Si finirebbe per essere qualcosa di simile

if (serverStudent[0].name == dbStudent[0].name) 
    //overwrite dbStudent object with serverStudent fields 

Qual è il modo più efficiente/leggero per ottenere persistenza oggetto e quindi il confronto in Android?

+0

Potete fornire qualche dettaglio in più? Hai già un database? Quanti dischi ci sarebbero? Hanno un timestamp aggiornato? Perché non archiviare lo stesso xml? –

risposta

3

Ecco un metodo che ho usato in passato:

Ogni volta che un oggetto nel database viene modificato, utilizzare una colonna timestamp per memorizzare quel momento. Quando l'app si connette all'avvio, è sufficiente controllare ogni timestamp nell'app db rispetto al timestamp nel db del server per ciascun oggetto. Se i timestamp corrispondono, non fare nulla. Se i timestamp non corrispondono, recupera il record aggiornato dal server. Assicurati di utilizzare un timestamp sufficiente per i dettagli (in genere fino a millisecondi o microsecondi).

La cosa bella dei timestamp è che se non si desidera che i dati del server ignorino i dati dell'app, è possibile vedere quale è più recente e conservare quell'oggetto se sono stati entrambi modificati. Aggiungendo solo alcuni pensieri aggiuntivi!

+0

Buona risposta. Inoltre, sul server è presente un servizio che elenca (e consolida) tutti gli aggiornamenti da qualsiasi data data. In questo modo puoi connetterti e ottenere immediatamente il delta tra i due sistemi. –

+0

Vero! Si può semplicemente memorizzare UNO timestamp per utente che viene aggiornato ogni volta che viene aggiornato un record che hanno "ritirato". Quindi prova solo 1 volta ogni volta e se non corrisponde, recupera semplicemente i record con i timestamp più recenti! –

+0

Tuttavia, i timestamp possono essere problematici se si devono tenere conto dei fusi orari. È possibile utilizzare invece un GUID. –

0

Guarda anche questi librerie:
http://www.datadroidlib.com/
https://github.com/octo-online/robospice
credo che entrambe le soluzioni di offerta per la vostra situazione.

Oppure puoi rollare la tua soluzione ... Fondamentalmente vorrai creare un servizio o asynctask per fare la sincronizzazione, nel tuo oggetto studente puoi creare un costruttore che puoi passare un id e farlo estrarre record appropriato dal tuo db locale quindi creare un metodo di confronto che si aggiornerà se sono disponibili informazioni più recenti.

+0

Risposte solo per collegamento [sono scoraggiate] (http://meta.stackexchange.com/a/8259/166749). Puoi ampliare questa risposta per renderla più utile? –

+0

@PaulBellora Grazie perché non lo sapevo. Ho aggiunto più informazioni ma l'op sembra capire cosa deve fare, solo cercando il modo migliore per farlo. Queste librerie offrono soluzioni complete da un capo all'altro per questo specifico compito. –

0

Non sono sicuro di aver capito correttamente la tua domanda. Ma per quanto ho capito, avrei fatto qualcosa del genere.

  • Nel lato server inviare manda JSON che contiene oggetti json student.
  • Nel lato Android creare il simulatore La classe e l'override degli studenti equivalgono al metodo come si desidera.
  • Quindi per ogni studente verificare con il metodo uguale se sono uguale o meno e agire di conseguenza.
  • Se si desidera effettuare una ricerca più rapida nell'array di oggetti studente, applicare la mappa di hash anziché gli array.
+0

il problema è che adesso dovrei ricostruire l'oggetto studente una volta che ho una query restituita dal mio db per poter confrontare l'oggetto studente appena creato dai dati json che ho ricevuto. Non sembra eccessivo? Sto cercando una soluzione migliore nella persistenza dello studente nel db quindi non deve essere forzato in un oggetto una volta recuperato dal db per il confronto –

1

Si può fare qualcosa di simile -

public class StudentRecord { 
    Vector<StudentData> studentDatas; 
    public StudentRecord() 
    { 
     studentDatas = new Vector<StudentData>(); 
    } 
    public Vector<StudentData> getRecords() { 
     return studentDatas; 
    } 
    public void setRecords(Vector<StudentData> records) { 
     this.studentDatas = records; 
    } 

    public class StudentData 
    { 
     String name,Rollno; 

     public String getRollno() { 
      return Rollno; 
     } 

     public void setRollno(String rollno) { 
      Rollno = rollno; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

    } 

} 

Quando si ottiene l'oggetto vettoriale studentDatas si può fare qualcosa di simile -

for(Object object : record.getRecords()) 
     { 
      data = (StudentData)object; 
      data.getRollno(); 
      data.getName(); 
     } 
Problemi correlati