Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将SQLite从PC同步到Android_Android_Sqlite_Sync_Pc - Fatal编程技术网

如何将SQLite从PC同步到Android

如何将SQLite从PC同步到Android,android,sqlite,sync,pc,Android,Sqlite,Sync,Pc,我的电脑上有一个简单的SQLite数据库,其中包含一个表。我的Android应用程序中有相同的SQLite数据库。数据库PC版本上的数据会不时更改。如何将PC上的SQLite数据库的数据同步到Android设备上的SQLite数据库?提前感谢您提供的任何链接或示例 这需要相当多的工作才能让它顺利运行。以下是我的想法: 使用Android上的接收器检测USB何时插入。当检测到这种情况时,将数据库文件复制到您选择的文件夹(比如/data/com.example.package/sync/db.sq

我的电脑上有一个简单的SQLite数据库,其中包含一个表。我的Android应用程序中有相同的SQLite数据库。数据库PC版本上的数据会不时更改。如何将PC上的SQLite数据库的数据同步到Android设备上的SQLite数据库?提前感谢您提供的任何链接或示例

这需要相当多的工作才能让它顺利运行。以下是我的想法:

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

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

这是一个使用套接字的简单解决方案:

  • 服务器端:

    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();
    

  • 我希望不用连接usb就能完成。另外,如果我将其复制到包目录,这不会在android设备上放置数据库的未压缩版本吗?谢谢你的回复!您还可以选择在应用程序中创建一个小型http服务器,该服务器将提供DB文件以下载到PC软件。你可以对DB文件做任何你想做的事情,如果你愿意,你可以在复制之前对它进行压缩和加密(只需再多几个Java代码行),所以经过大量研究后,我认为最好的处理方法是在android应用程序中使用Java套接字,在本地网络的PC上使用Java服务器套接字应用程序。每个字段中的两个数据库都将包含一个DB版本ID。然后,我可以使用Java套接字从我的android设备连接到电脑上的Java app ServerSocket。然后,从电脑上,我根据android SQLite DB中的DB版本ID查询电脑SQLite数据库中的较新数据,并将任何较新的结果发送回电脑。从那里,我只需将这些结果插入android端SQLite数据库。一个端口将需要转发到PC。嘿,伙计,我正在做同样的事情,并卡住了。如果您有解决方案,请也在manishshrm330@gmail.com.