2012-03-30 5 views
0

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

+0

Эй приятель, я делаю то же самое и застрял. Если у вас есть решение, пожалуйста, предоставьте мне решение также на [email protected] –

ответ

1

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

  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

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

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

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

+0

Я надеялся, что это можно сделать без подключения к USB. Кроме того, если я скопирую его в каталог пакета, не будет ли размещена несжатая версия базы данных на устройстве Android? Спасибо за ответ! – user1302684

+0

Вы также можете создать небольшой сервер http в своем приложении, в котором будет предлагаться файл DB для загрузки на компьютер. Вы делаете все, что хотите, с файлом DB, вы можете сжимать и шифровать его, если хотите до копирования (всего несколько строк кода Java). –

+0

Итак, после большого исследования я считаю, что лучший способ справиться с этим - Java Socket в приложении android и приложение Java Socket Socket на ПК в локальной сети. Обе базы данных в каждом поле будут содержать идентификатор версии БД. Затем я могу подключиться к своему устройству Android с помощью Java Socket для своего приложения Java Server Server на ПК. С ПК я затем запрашиваю базу данных SQL SQLite для новых данных на основе идентификатора версии DB из базы данных android SQLite db и отправляю любые новые результаты. Оттуда я просто вставляю эти результаты в сторону SQLite db для Android. Один порт должен быть перенаправлен на ПК. – user1302684

 Смежные вопросы

  • Нет связанных вопросов^_^