简体   繁体   English

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

[英]How to download an SQLite database from an Android device?

Before spending hours trying to figure this out, maybe I can use someone's expertise; 在花费数小时试图解决这个问题之前,也许我可以使用某人的专业知识; would it be possible to generate an SQLite database on a (web)server and download it to an Android device and then use it? 是否可以在(Web)服务器上生成SQLite数据库并将其下载到Android设备然后使用它?

I need to sync data, but it probably would be much faster to create the database completely and send that as binary. 我需要同步数据,但完全创建数据库并将其作为二进制文件发送可能要快得多。

Here's my implementation: 这是我的实现:

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

This downloads the database into your applications private storage see here 这将数据库下载到您的应用程序私有存储中, 请参见此

Don't forget you need the internet permission in your manifest. 不要忘记您需要在清单中获得互联网许可。

To then get an actual database from this file you can do this: 然后从此文件中获取实际数据库,您可以执行以下操作:

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

Your accepted solution seemed to take a long time when I tried downloading a file with it. 当我尝试使用它下载文件时,您接受的解决方案似乎需要很长时间。 I found a better solution (with progress indicator) here: 我在这里找到了更好的解决方案(带进度指示器):

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

It includes source code and step-by-step tutorial. 它包括源代码和分步教程。

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

Pretty much what it teaches is how to create a database for use in Android (and any quirks that follow) and it also shows you how to copy that code into your applications internal database storage location. 它教授的内容是如何创建一个在Android中使用的数据库(以及随后的任何怪癖),它还向您展示了如何将该代码复制到应用程序内部数据库存储位置。

From there it shouldn't be too difficult to figure out how to modify it to work for downloading SQLLite . 从那里开始,弄清楚如何修改它以便下载SQLLite应该不会太难。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM