Как загрузить базу данных SQLite с устройства Android? - PullRequest
9 голосов
/ 23 августа 2011

Прежде чем часами пытаться понять это, возможно, я смогу воспользоваться чьим-то опытом; Можно ли создать базу данных SQLite на (веб) сервере и загрузить ее на устройство Android, а затем использовать ее?

Мне нужно синхронизировать данные, но, вероятно, будет гораздо быстрее полностью создать базу данных и отправить ее в двоичном виде.

Ответы [ 3 ]

8 голосов
/ 23 августа 2011

Вот моя реализация:

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

Это загружает базу данных в личное хранилище ваших приложений см. Здесь

Не забудьте, что вам нужно разрешение на подключение к Интернету в вашем приложении.manifest.

Чтобы затем получить фактическую базу данных из этого файла, вы можете сделать это:

   /**
     * 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();
    }
3 голосов
/ 14 февраля 2012

Ваше принятое решение, похоже, заняло много времени, когда я пытался загрузить файл с ним. Я нашел лучшее решение (с индикатором прогресса) здесь:

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

Включает в себя исходный код и пошаговое руководство.

1 голос
/ 23 августа 2011

Этот сайт мне очень помог! http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

Практически все, что он учит, - это как создать базу данных для использования в Android (и любые другие причуды), а также показывает, как скопировать этот код во внутреннее хранилище базы данных ваших приложений.

Оттуда не должно быть слишком сложно выяснить, как изменить его для работы для загрузки SQLLite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...