如何将SQLite从PC同步到Android

问题描述:

我的电脑上有一个简单的SQLite数据库,其中包含一个表。我的Android应用程序中有相同的SQLite数据库。数据在个人电脑版本中随时会变化。我怎样才能将数据从PC上的SQLite数据库同步到Android设备上的SQLite数据库?预先感谢任何链接或示例。如何将SQLite从PC同步到Android

+0

嘿,伙计,我做的同样的事情,并卡住。如果您有解决方案,请在[email protected]提供我的解决方案。 – 2013-12-12 13:17:11

这是插座一个简单的解决方案:

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

这将需要相当多的工作才能让它毫无问题地运行。下面是我该怎么走:

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

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

+0

我希望它可以完成,而无需与USB连接。另外,如果我将它复制到软件包目录中,并不是在android设备上放置数据库的未压缩版本?谢谢回复! – user1302684 2012-03-30 07:57:11

+0

您也可以选择在您的应用程序中创建一个小型http服务器,该服务器将提供DB文件供下载到PC软件。你可以在数据库文件中做任何你想做的事情,如果你喜欢它之前你可以压缩和加密它(只需要更多的Java代码行) – 2012-03-30 10:08:53

+0

因此经过大量的研究,我认为处理这个问题的最好方法是使用Android应用程序中的Java Socket和本地网络上PC上的Java Server Socket应用程序。每个字段中的两个数据库都将包含数据库版本ID。然后,我可以使用Java Socket将我的Android设备连接到PC上的Java应用程序ServerSocket。然后在PC上查询PC SQLite数据库以获取基于来自android SQLite数据库的数据库版本ID的新数据,并发送任何更新的结果。从那里我只是将这些结果插入到android端SQLite数据库。一个端口需要被转发到PC。 – user1302684 2012-03-31 07:57:22