У меня есть простая база данных SQLite на моем ПК, содержащая одну таблицу. У меня есть одна и та же база данных SQLite в приложении для Android. Время от времени данные изменяются на ПК-версии базы данных. Как мне синхронизировать данные из базы данных SQLite на ПК с базой данных SQLite на устройстве Android? Заранее благодарим за любые ссылки или примеры.Как синхронизировать SQLite с ПК на Android
ответ
Это простое решение с сокетами:
стороне сервера:
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(); }
стороне клиента:
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();
Это займет немало работы, чтобы запустить его без проблем. Вот как я пойду:
- Используйте приемник на Android, чтобы обнаружить, когда USB подключен. Когда это будет обнаружено, скопируйте файл базы данных на SD-карту в папку по вашему выбору (скажем /data/com.example.package/sync/db.sqlite).
- С вашего компьютера обнаруживайте запоминающие устройства большой емкости. Сканируйте SD-карту, чтобы проверить, найден ли файл по указанному выше пути. Если нет, синхронизация отсутствует. Если да, то вам нужно выполнить некоторое сравнение БД (Google для алгоритмов и в зависимости от ваших данных у вас есть разные возможности здесь)
- Теперь у вас должен быть третий файл базы данных (результат синхронизации между ПК и Android базы данных). Этот файл может быть скопирован в массовое хранилище (ваша SD-карта) в том же месте, где он был взят.
- Используйте приемник на Android, чтобы определить, когда установлена SD-карта. Когда это обнаружено, просто скопируйте файл базы данных из /data/com.example.package/sync/db.sqlite в каталог вашего пакета приложений.
Мы сделали это для музыкального приложения. Это не тривиальная задача, но нам удалось заставить ее работать очень хорошо.
Я надеялся, что это можно сделать без подключения к USB. Кроме того, если я скопирую его в каталог пакета, не будет ли размещена несжатая версия базы данных на устройстве Android? Спасибо за ответ! – user1302684
Вы также можете создать небольшой сервер http в своем приложении, в котором будет предлагаться файл DB для загрузки на компьютер. Вы делаете все, что хотите, с файлом DB, вы можете сжимать и шифровать его, если хотите до копирования (всего несколько строк кода Java). –
Итак, после большого исследования я считаю, что лучший способ справиться с этим - Java Socket в приложении android и приложение Java Socket Socket на ПК в локальной сети. Обе базы данных в каждом поле будут содержать идентификатор версии БД. Затем я могу подключиться к своему устройству Android с помощью Java Socket для своего приложения Java Server Server на ПК. С ПК я затем запрашиваю базу данных SQL SQLite для новых данных на основе идентификатора версии DB из базы данных android SQLite db и отправляю любые новые результаты. Оттуда я просто вставляю эти результаты в сторону SQLite db для Android. Один порт должен быть перенаправлен на ПК. – user1302684
Эй приятель, я делаю то же самое и застрял. Если у вас есть решение, пожалуйста, предоставьте мне решение также на [email protected] –