Как синхронизировать SQLite с ПК на Android - PullRequest
0 голосов
/ 30 марта 2012

У меня есть простая база данных SQLite на моем ПК, содержащая одну таблицу. У меня та же база данных SQLite в моем приложении для Android. Данные периодически изменяются в версии базы данных для ПК. Как выполнить синхронизацию данных из базы данных SQLite на ПК с базой данных SQLite на устройстве Android? Заранее спасибо за любые ссылки или примеры.

Ответы [ 2 ]

1 голос
/ 17 мая 2012

Это простое решение с сокетами:

  1. Сторона сервера:

    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. Клиентская сторона:

        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 голосов
/ 30 марта 2012

Это займет довольно много времени, чтобы запустить его без проблем. Вот как бы я пошел:

  • Используйте приемник на Android, чтобы определить, подключен ли USB. Когда это обнаружено, скопируйте файл базы данных на SD-карту в папку по вашему выбору (скажем, /data/com.example.package/sync/db.sqlite).
  • С вашего ПК, обнаружить устройства хранения данных. Сканирование SD-карты, чтобы проверить, если вы найдете файл по указанному выше пути. Если нет, синхронизировать нечего. Если да, то вам нужно будет провести некоторое сравнение БД (Google для алгоритмов и в зависимости от ваших данных у вас есть различные возможности здесь)
  • Теперь у вас должен быть третий файл базы данных (результат синхронизации между базами данных ПК и Android). Этот файл можно скопировать на запоминающее устройство (вашу SD-карту) в том же месте, где он был взят.
  • Используйте приемник на Android, чтобы определить, когда установлена ​​SDCard. Когда это обнаружено, просто скопируйте файл базы данных из /data/com.example.package/sync/db.sqlite в каталог пакета приложения.

Мы сделали это для музыкального приложения. Это не тривиальная задача, но нам удалось заставить ее работать довольно хорошо.

...