2011-08-23 79 views
9

在花費數小時試圖解決這個問題之前,也許我可以使用某人的專業知識;是否可以在(網絡)服務器上生成SQLite數據庫並將其下載到Android設備,然後使用它?如何從Android設備下載SQLite數據庫?

我需要同步數據,但完全創建數據庫並將其作爲二進制文件發送可能會快得多。

+1

是的..它是:-) – Blundell

回答

7

這裏是我的實現:

 private static boolean downloadDatabase(Context context) { 
       try { 
         // Log.d(TAG, "downloading database"); 
         URL url = new URL("http://some-url.com/db/" + "db_name.s3db"); 
         /* Open a connection to that URL. */ 
         URLConnection ucon = url.openConnection(); 
         /* 
         * Define InputStreams to read from the URLConnection. 
         */ 
         InputStream is = ucon.getInputStream(); 
         BufferedInputStream bis = new BufferedInputStream(is); 
         /* 
         * Read bytes to the Buffer until there is nothing more to read(-1). 
         */ 
         ByteArrayBuffer baf = new ByteArrayBuffer(50); 
         int current = 0; 
         while ((current = bis.read()) != -1) { 
           baf.append((byte) current); 
         } 

         /* Convert the Bytes read to a String. */ 
         FileOutputStream fos = null; 
         // Select storage location 
         fos = context.openFileOutput("db_name.s3db", Context.MODE_PRIVATE); 

         fos.write(baf.toByteArray()); 
         fos.close(); 
         // Log.d(TAG, "downloaded"); 
       } catch (IOException e) { 
         Log.e(TAG, "downloadDatabase Error: " , e); 
         return false; 
       } catch (NullPointerException e) { 
         Log.e(TAG, "downloadDatabase Error: " , e); 
         return false; 
       } catch (Exception e){ 
         Log.e(TAG, "downloadDatabase Error: " , e); 
         return false; 
       } 
       return true; 
     } 

此下載數據庫到應用程序的私有存儲see here

別忘了你所需要的網絡許可,您的清單。

爲了然後得到從這個文件的實際的數據庫,你可以這樣做:

/** 
    * Copies your database from your local downloaded database that is copied from the server 
    * into the just created empty database in the 
    * system folder, from where it can be accessed and handled. 
    * This is done by transfering bytestream. 
    * */ 
     private void copyServerDatabase() { 
      // by calling this line an empty database will be created into the default system path 
      // of this app - we will then overwrite this with the database from the server 
      SQLiteDatabase db = getReadableDatabase(); 
      db.close(); 


       OutputStream os = null; 
       InputStream is = null; 
       try { 
         // Log.d(TAG, "Copying DB from server version into app"); 
         is = mContext.openFileInput("db_name.s3db"); 
         os = new FileOutputStream("/data/data/your.package.name/databases/"); // XXX change this 

         copyFile(os, is); 
       } catch (Exception e) { 
         Log.e(TAG, "Server Database was not found - did it download correctly?", e);       
       } finally { 
         try { 
           //Close the streams 
           if(os != null){ 
             os.close(); 
           } 
           if(is != null){ 
             is.close(); 
           } 
         } catch (IOException e) { 
           Log.e(TAG, "failed to close databases"); 
         } 
       } 
        // Log.d(TAG, "Done Copying DB from server"); 
     } 




    private void copyFile(OutputStream os, InputStream is) throws IOException { 
      byte[] buffer = new byte[1024]; 
      int length; 
      while((length = is.read(buffer))>0){ 
        os.write(buffer, 0, length); 
      } 
      os.flush(); 
    } 
+0

其中是「copyFile」定義? – gonzobrains

+0

對不起,添加它 – Blundell

+0

getReadableDatabase沒有找到,你從哪裏得到它? – dvdciri