2013-05-17 17 views
5

Pracuję nad aplikacją dla systemu Android, która ładuje na liście uczniów wyświetlanych w działaniu opartym na liście. Istnieją dwa składniki do aplikacji. Istnieje serwer, który odpowiada za pomocą xml z listą aktualnych aktywnych studentów i bazą danych na końcu aplikacji, która przechowuje tezy z pewnymi szczegółami (imię, wiek itp.). Chciałbym zsynchronizować te dwa źródła danych. Po uruchomieniu aplikacji chciałbym sprawdzić w pliku xml, czy uczniowie na serwerze zostali dodani/usunięci i odpowiednio zaktualizować db.Przechowywanie i porównywanie obiektów z bazy danych

Będę parsować listę Xml w obiekcie ucznia przy logowaniu. Czy istnieje sposób na przechowywanie/pobieranie całego obiektu do obsługiwanego systemu operacyjnego Android, dzięki czemu mogę wykonać bezpośrednie porównanie, aby zobaczyć, co zaktualizować/usunąć? To w końcu jest coś

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

Jaki jest najbardziej wydajny/lekka droga do osiągnięcia obiektowe wytrwałości, a następnie porównania w Androidzie?

+0

można podać trochę więcej szczegółów? Czy masz już bazę danych? Ile będzie rekordów? Czy mają zaktualizowany znacznik czasu? Dlaczego po prostu nie przechowywać samego pliku xml? –

Odpowiedz

3

Oto metoda użyłem w przeszłości:

Anytime obiekt w bazie danych zostanie zmieniona, należy użyć kolumny timestamp przechowywać ten czas. Gdy aplikacja łączy się podczas uruchamiania, po prostu sprawdź każdy znacznik czasu w aplikacji db względem znacznika czasu w db serwera dla każdego obiektu. Jeśli znaczniki czasu pasują, nie rób nic. Jeśli znaczniki czasu nie są zgodne, pobierz zaktualizowany rekord z serwera. Upewnij się, że używasz wystarczająco dokładnego znacznika czasu (zwykle do milli- lub mikrosekund).

Dobrą cechą znaczników czasu jest to, że jeśli nie chcesz, aby dane serwera przesłaniały dane aplikacji, możesz sprawdzić, który z nich jest nowszy i zachować ten obiekt, jeśli oba zostały edytowane. Wystarczy dodać kilka dodatkowych myśli!

+0

Dobra odpowiedź. Masz również na serwerze usługę, która wyszczególnia (i konsoliduje) wszystkie aktualizacje od danego znacznika czasu. W ten sposób możesz połączyć się i natychmiast uzyskać różnicę między dwoma systemami. –

+0

True! Możesz po prostu zapisać JEDNO znacznik czasu na użytkownika, który zostanie zaktualizowany za każdym razem, gdy zostanie zaktualizowany rekord "wyrejestrowany". Następnie za każdym razem testujesz tylko 1 znacznik czasu, a jeśli nie pasuje, po prostu pobierz zapisy z nowszymi sygnaturami czasowymi! –

+0

Znaczniki czasu mogą być jednak kłopotliwe, jeśli trzeba uwzględnić strefy czasowe. Zamiast tego możesz użyć identyfikatora GUID. –

0

Sprawdź te biblioteki:
http://www.datadroidlib.com/
https://github.com/octo-online/robospice
wierzę oba roztwory oferta dla danej sytuacji.

Możesz też rozwinąć własne rozwiązanie ... Zasadniczo będziesz chciał utworzyć usługę lub asynktask, aby wykonać synchronizację, w obiekcie ucznia możesz utworzyć konstruktor, do którego możesz przekazać identyfikator i zlecić jego wykonanie Odpowiedni rekord z lokalnej bazy danych to metoda porównawcza, która zostanie zaktualizowana, jeśli będą dostępne nowsze informacje.

+0

Odpowiedzi dotyczące wyłącznie linków [są odradzane] (http://meta.stackexchange.com/a/8259/166749). Czy możesz rozwinąć tę odpowiedź w ogóle, aby była bardziej pomocna? –

+0

@PaulBellora Dziękuję, ponieważ tego nie wiedziałem. Dodałem więcej informacji, ale operacja wydaje się rozumieć, co powinien zrobić, po prostu szukając najlepszego sposobu na zrobienie tego. Te biblioteki oferują kompletne rozwiązania od końca do końca dla tego konkretnego zadania. –

0

Nie jestem pewien, czy zrozumiałem twoje pytanie poprawnie. Ale o ile rozumiem, zrobiłbym coś takiego.

  • Po stronie serwera wyślij wyślij tablicę Json, która zawiera obiekty json-ucznia.
  • W Androidzie stwórz klasę Similer Studenta i przesuń kursor w taki sposób, jak chcesz, metodą .
  • Następnie dla każdego ucznia należy sprawdzić metodą równą, czy są one , czy też nie i podjąć odpowiednie działania.
  • Jeśli chcesz wykonać szybsze wyszukiwanie w tablicy obiektów uczniów, zastosuj zamiast tablicy tablicową mapę mieszania .
+0

Problem polega na tym, że w tej chwili musiałbym zrekonstruować obiekt ucznia, gdy otrzymam zapytanie zwrócone z mojej bazy danych, aby porównać z obiektem ucznia, który właśnie utworzyłem z danych json, które otrzymałem. Czy to nie wydaje się przesadne? Szukam lepszego rozwiązania w persistance studenta w db, więc nie musi być zmuszony do obiektu raz pobrane z db do porównania –

1

można zrobić coś takiego -

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; 
     } 

    } 

} 

Gdy pojawi się obiekt wektorowy studentDatas można zrobić coś takiego -

for(Object object : record.getRecords()) 
     { 
      data = (StudentData)object; 
      data.getRollno(); 
      data.getName(); 
     } 
Powiązane problemy