2012-03-30 13 views
0

Ich habe eine einfache SQLite-Datenbank auf meinem PC, die eine Tabelle enthält. Ich habe die gleiche SQLite-Datenbank in meiner Android App. Die Daten ändern sich von Zeit zu Zeit auf der PC-Version der Datenbank. Wie gehe ich vor, um die Daten von der SQLite-Datenbank auf dem PC zur SQLite-Datenbank auf dem Android-Gerät zu synchronisieren? Vielen Dank im Voraus für Links oder Beispiele.Wie man SQLite von PC zu Android synchronisiert

+0

Hey Kumpel, mache ich die gleiche Sache und stecken geblieben. Wenn Sie die Lösung haben, bitte geben Sie mir Lösung auch an [email protected] –

Antwort

1

Dies ist eine einfache Lösung mit Steckdosen:

  1. Seite Server:

    ServerSocket servsock = new ServerSocket(2004); 
    while (true) { 
        System.out.println("Waiting..."); 
        Socket sock = servsock.accept(); 
        System.out.println("Accepted connection : " + sock); 
        BufferedReader input = new BufferedReader(
          new InputStreamReader(sock.getInputStream())); 
        String serverResponse = input.readLine(); 
        // sendfile 
        File myFile = new File("C://XXXX/XXXX/XXXXX.db"); 
        byte [] mybytearray = new byte [(int)myFile.length()]; 
        FileInputStream fis = new FileInputStream(myFile); 
        BufferedInputStream bis = new BufferedInputStream(fis); 
        bis.read(mybytearray,0,mybytearray.length); 
        OutputStream os = sock.getOutputStream(); 
        System.out.println("Sending..."); 
        os.write(mybytearray,0,mybytearray.length); 
        os.flush(); 
        sock.close(); 
        } 
    
  2. Client-Seite:

    private String serverIpAddress = "xxx.xxx.xxx.xxx"; 
    private static final int REDIRECTED_SERVERPORT = 2004; 
    InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
    socket = new Socket(serverAddr, REDIRECTED_SERVERPORT); 
    int filesize = 6022386; 
    int bytesRead; 
    int current = 0; 
    byte[] mybytearray = new byte[filesize]; 
    
    InputStream is = socket.getInputStream(); 
    
    BufferedReader input = new BufferedReader(new InputStreamReader(is)); 
    FileOutputStream fos = new FileOutputStream(
         "/data/data/XXXXX/databases/XXXXX.db"); 
    BufferedOutputStream bos = new BufferedOutputStream(fos); 
    
    bytesRead = is.read(mybytearray, 0, mybytearray.length); 
    current = bytesRead; 
    
    do { 
        bytesRead = is.read(mybytearray, current, 
          (mybytearray.length - current)); 
        if (bytesRead >= 0) 
         current += bytesRead; 
    } while (bytesRead > -1); 
    
    bos.write(mybytearray, 0, current); 
    bos.flush(); 
    bos.close(); 
    socket.close(); 
    
0

Dies wird einige Arbeit benötigen, um es ohne Probleme laufen zu lassen. Hier ist, wie ich gehen würde:

  • einen Empfänger im Android verwenden zu erkennen, wenn USB angeschlossen ist. Wenn dies erkannt wird, kopieren Sie Ihre Datenbankdatei in einem Ordner Ihrer Wahl auf die SD-Karte (zB /data/com.example.package/sync/db.sqlite).
  • Von Ihrem PC aus Massenspeichergeräte erkennen. Scannen Sie die SD-Karte, um zu prüfen, ob Sie die Datei im obigen Pfad finden. Wenn nicht, gibt es nichts zu synchronisieren. Wenn ja, dann müssen Sie einen DB Vergleich durchführen (google für Algorithmen und abhängig von Ihren Daten haben Sie verschiedene Möglichkeiten hier)
  • Jetzt sollten Sie eine dritte Datenbankdatei haben (das Ergebnis der Synchronisierung zwischen PC und Android Datenbanken). Diese Datei kann an den gleichen Ort, an dem sie aufgenommen wurde, in den Massenspeicher (Ihre SD-Karte) kopiert werden.
  • Verwenden Sie einen Empfänger auf dem Android, um zu erkennen, wenn die SD-Karte montiert ist. Wenn dies erkannt wird, kopieren Sie einfach die Datenbankdatei von /data/com.example.package/sync/db.sqlite in Ihr Anwendungspaketverzeichnis.

Wir haben das für eine Musik-Anwendung. Dies ist keine triviale Aufgabe, aber wir haben es geschafft, dass es gut funktioniert.

+0

Ich hatte gehofft, dass es ohne Verbindung mit USB gemacht werden könnte. Auch, wenn ich es in das Paket-Verzeichnis kopieren, stellt das nicht eine unkomprimierte Version der Datenbank auf dem Android-Gerät? Danke für die Antwort! – user1302684

+0

Sie können auch einen kleinen http-Server in Ihrer App erstellen, der die DB-Datei zum Herunterladen in die PC-Software anbietet. Sie tun, was Sie wollen, mit der DB-Datei, können Sie es komprimieren und verschlüsseln, wenn Sie vor der Kopie möchten (nur ein paar mehr Java-Code-Zeilen) –

+0

Also nach viel Forschung denke ich, der beste Weg, damit umzugehen wäre mit einem Java Socket in der Android App und eine Java Server Socket App auf dem PC im lokalen Netzwerk. Beide Datenbanken in jedem Feld enthalten eine DB-Versionskennung. Ich kann dann von meinem Android-Gerät mit einem Java-Socket zu meiner Java-Anwendung ServerSocket auf dem PC verbinden. Vom PC aus frage ich dann die PC SQLite-Datenbank nach neueren Daten auf Basis der DB-Versions-ID aus der Android-SQLite-Datenbank und sende alle neueren Ergebnisse zurück. Von dort füge ich einfach diese Ergebnisse in die Android-Seite SQLite db. Ein Port muss an den PC weitergeleitet werden. – user1302684