【问题标题】:How To Sync SQLite From PC to Android如何将 SQLite 从 PC 同步到 Android
【发布时间】:2012-03-30 07:35:50
【问题描述】:

我的 PC 上有一个简单的 SQLite 数据库,其中包含一个表。我的 Android 应用程序中有相同的 SQLite 数据库。 PC版数据库的数据不时变化。如何将 PC 上的 SQLite 数据库中的数据同步到 Android 设备上的 SQLite 数据库?

【问题讨论】:

    标签: android sqlite synchronization


    【解决方案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();
      

    【讨论】:

      【解决方案2】:

      这需要相当多的工作才能让它正常运行。这是我要走的路:

      • 使用 Android 上的接收器检测 USB 何时插入。当检测到这种情况时,将您的数据库文件复制到您选择的文件夹中的 SD 卡(例如 /data/com.example.package/sync/db.sqlite)。
      • 从您的 PC 检测大容量存储设备。扫描 SD 卡以检查是否在上述路径中找到文件。如果没有,则没有可同步的内容。如果是,那么您需要执行一些数据库比较(谷歌算法,根据您的数据,您在这里有不同的可能性)
      • 现在您应该有第三个数据库文件(PC 和 Android 数据库之间同步的结果)。可以将此文件复制到大容量存储设备(您的 SD 卡)中的同一位置。
      • 使用 Android 上的接收器来检测 SDCard 何时安装。当检测到这种情况时,只需将数据库文件从 /data/com.example.package/sync/db.sqlite 复制到您的应用程序包目录。

      我们这样做是为了一个音乐应用程序。这不是一项简单的任务,但我们设法让它很好地工作。

      【讨论】:

      • 我希望无需连接 USB 即可完成。另外,如果我将它复制到包目录中,这不会在 android 设备上放置一个未压缩版本的数据库吗?感谢您的回复!
      • 您还可以选择在您的应用程序中创建一个小型 http 服务器,该服务器将提供 DB 文件以下载到 PC 软件。你可以对 DB 文件做任何你想做的事情,如果你喜欢,你可以在复制之前对其进行压缩和加密(只需多几行 Java 代码)
      • 所以经过大量研究后,我认为处理此问题的最佳方法是使用 android 应用程序中的 Java Socket 和本地网络上 PC 上的 Java Server Socket 应用程序。每个字段中的两个数据库都将包含一个数据库版本 ID。然后,我可以使用 Java Socket 从我的 android 设备连接到 PC 上的 Java 应用 ServerSocket。然后,我从 PC 查询 PC SQLite 数据库以获取基于来自 android SQLite db 的 DB 版本 ID 的更新数据,并将任何更新的结果发回。从那里我只需将这些结果插入到 android 端 SQLite db 中。需要将一个端口转发到 PC。
      猜你喜欢
      • 2016-03-31
      • 1970-01-01
      • 2015-08-05
      • 2011-05-07
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多