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

时间:2011-08-23 13:59:50

标签: android sqlite

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

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

3 个答案:

答案 0 :(得分:8)

这是我的实施:

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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

从那里了解如何修改它以便下载SQLLite应该不会太难。