2011-08-23 8 views
9

Antes de pasar horas tratando de resolver esto, tal vez pueda usar la experiencia de alguien; ¿sería posible generar una base de datos SQLite en un servidor (web) y descargarla a un dispositivo Android y luego usarla?¿Cómo descargar una base de datos SQLite desde un dispositivo Android?

necesito para sincronizar los datos, pero probablemente sería mucho más rápido para crear la base de datos completa y enviar ese como binario.

+1

sí .. que .. :-) se – Blundell

Respuesta

7

Aquí está mi aplicación:

 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; 
     } 

Este descargas la base de datos en sus aplicaciones para el almacenamiento privado see here

No se olvide que necesita el permiso de Internet en el manifiesto.

A continuación, obtener una base de datos real de este archivo se puede hacer esto:

/** 
    * 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

donde se "copyFile" define? – gonzobrains

+0

Lo sentimos, lo agregó – Blundell

+0

getReadableDatabase no se encuentra, ¿dónde lo obtiene? – dvdciri

1

Este sitio web me ayudó un montón! http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

Más o menos lo que enseña es cómo crear una base de datos para Android (y las peculiaridades siguientes) y también muestra cómo copiar ese código en la ubicación de almacenamiento de la base de datos interna de las aplicaciones.

A partir de ahí, no debería ser demasiado difícil de encontrar la manera de modificarlo para trabajar para la descarga de SQLLite.

4

Su solución aceptada parecía llevar mucho tiempo cuando traté de descargar un archivo con ella. He encontrado una solución mejor (con indicador de progreso) aquí:

http://www.hassanpur.com/blog/2011/04/android-development-downloading-a-file-from-the-web/

Incluye código fuente y paso a paso tutorial.

+0

" Error al establecer una conexión de base de datos "desde ese enlace – athospy

+0

Mi la respuesta fue dada hace 4 años. Tal vez intente con el caché de Google. – gonzobrains

Cuestiones relacionadas