如何从Android设备下载SQLite数据库?

在花费数小时试图解决这个问题之前,也许我可以使用某人的专业知识; 是否可以在(Web)服务器上生成SQLite数据库并将其下载到Android设备然后使用它?

我需要同步数据,但完全创建数据库并将其作为二进制文件发送可能要快得多。

这是我的实现:

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

这将数据库下载到您的应用程序私有存储中, 请参见此

不要忘记您需要在清单中获得互联网许可。

然后从此文件中获取实际数据库,您可以执行以下操作:

  /** * 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(); } 

当我尝试使用它下载文件时,您接受的解决方案似乎需要很长时间。 我在这里find了更好的解决方案(带进度指示器):

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

它包括源代码和分步教程。

这个网站对我帮助很大! http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

它教授的内容是如何创建一个在Android中使用的数据库(以及随后的任何怪癖),它还向您展示了如何将该代码复制到应用程序内部数据库存储位置。

从那里开始,找出如何修改它以便下载SQLLite应该不会太困难。