Предоставить базу данных, упакованную с файлом .APK, или разместить ее отдельно на веб-сайте? - PullRequest
3 голосов
/ 29 октября 2009

Вот немного информации о моем приложении:

Я разрабатываю приложение для Android, которое будет отображать случайную цитату или стих для пользователя. Для этого я использую базу данных SQLite. Размер БД может составлять приблизительно от 5 до 10 тыс. Записей, возможно, до более 1 млн. В более поздних версиях по мере добавления новых цитат и стихов. Таким образом, пользователю необходимо будет обновить БД по мере появления новых версий приложения или БД.

После прочтения некоторых форумов в Интернете, мне кажется, есть два возможных способа предоставить БД: 1. Связать его с файлом приложения .APK или 2. Загрузите его на сайт моего приложения, откуда пользователи должны будут загрузить его

Я хочу знать, какой метод будет лучше (если есть другой подход, кроме этого, пожалуйста, дайте мне знать).

После обдумывания этой проблемы в течение некоторого времени у меня возникают следующие мысли относительно вышеуказанных подходов:

Подход 1: Пользователи получат БД вместе с приложением и не будут загружать ее отдельно. Установка, таким образом, будет проще. Но пользователям придется переустанавливать приложение каждый раз, когда появляется новая версия БД. Кроме того, если размер БД велик, установка будет слишком громоздкой.

Подход 2: Пользователи должны будут загрузить полную БД с веб-сайта (хотя я могу предоставить небольшую примерную версию БД с помощью подхода 1). Но установщик будет проще и меньше по размеру. Кроме того, я мог бы легко предоставить будущие версии БД для тех, кто может не захотеть более новых версий приложения.

Не могли бы вы сказать мне с технической и административной точек зрения, какой подход был бы лучше и почему?

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

Спасибо!

Andruid

Ответы [ 3 ]

3 голосов
/ 30 октября 2009

Я создал аналогичное приложение для Android, которое периодически обновляется данными правительственного агентства. Довольно просто создать совместимую с Android базу данных на устройстве с помощью perl или аналогичного и загрузить ее на телефон с веб-сайта; и это работает довольно хорошо, плюс пользователь получает текущие данные, когда они загружают приложение. Также предполагается, что можно выбросить данные на SD-карту, если вы хотите избежать использования основного пространства для хранения данных, что больше всего беспокоит мое приложение с базой данных ~ 6 МБ.

Чтобы сделать Android счастливым с БД, я считаю, что вы должны сделать следующее (я строю свою БД с использованием perl).

$st = $db->prepare( "CREATE TABLE \"android_metadata\" (\"locale\" TEXT DEFAULT 'en_US')");
$st->execute();

$st = $db->prepare( "INSERT INTO \"android_metadata\" VALUES ('en_US')");
$st->execute();

У меня есть действие по обновлению, которое проверяет наличие обновлений погоды и, если да, отображает экран «Обновление сейчас». Процесс загрузки выглядит следующим образом и находится в DatabaseHelperClass.

public void downloadUpdate(final Handler handler, final UpdateActivity updateActivity) {
    URL url;
    try {
        close();

        File f = new File(getDatabasePath());
        if (f.exists()) {
            f.delete();
        }

        getReadableDatabase();
        close();

        url = new URL("http://yourserver.com/" + currentDbVersion + ".sqlite");

        URLConnection urlconn = url.openConnection();
        final int contentLength = urlconn.getContentLength();
        Log.i(TAG, String.format("Download size %d", contentLength));
        handler.post(new Runnable() {
            public void run() {
                updateActivity.setProgressMax(contentLength);
            }
        });

        InputStream is = urlconn.getInputStream();

        // Open the empty db as the output stream
        OutputStream os = new FileOutputStream(f);

        // transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024 * 1000];
        int written = 0;
        int length = 0;
        while (written < contentLength) {
            length = is.read(buffer);
            os.write(buffer, 0, length);
            written += length;
            final int currentprogress = written;
            handler.post(new Runnable() {
                public void run() {
                    Log.i(TAG, String.format("progress %d", currentprogress));
                    updateActivity.setCurrentProgress(currentprogress);
                }
            });
        }

        // Close the streams
        os.flush();
        os.close();
        is.close();

        Log.i(TAG, "Download complete");

        openDatabase();
    } catch (Exception e) {
        Log.e(TAG, "bad things", e);
    }
    handler.post(new Runnable() {
        public void run() {
            updateActivity.refreshState(true);
        }
    });
}

Также обратите внимание, что я сохраняю номер версии в имени файла db-файлов и указатель на текущий номер в текстовом файле на сервере.

2 голосов
/ 29 октября 2009

Звучит так, как будто ваше приложение и ваша база данных тесно связаны - то есть база данных бесполезна без базы данных, а база данных бесполезна без приложения, поэтому я бы сказал, что нужно поместить их в одно и то же. APK.

При этом, если вы ожидаете, что БД будет меняться очень медленно с течением времени, но приложение будет меняться быстрее, и вы не хотите, чтобы ваши пользователи загружали БД с каждой новой версией приложения, тогда вы можете захотеть распутать их. Чтобы сделать эту работу, вы можете сделать одну из двух вещей:

  1. Установите их как отдельные приложения, но убедитесь, что они используют один и тот же ИД пользователя, используя тег sharedUserId в файле AndroidManifest.xml.
  2. Установите их как отдельные приложения и создайте ContentProvider для базы данных. Таким образом, другие приложения также могут использовать вашу базу данных (если это полезно).
0 голосов
/ 29 октября 2009

Если вы собираетесь хранить БД на своем веб-сайте, то я бы порекомендовал вам просто делать rpc-вызовы на ваш веб-сервер и получать данные таким образом, чтобы устройству никогда не приходилось работать с локальной базой данных. Также поможет использование менеджера кэша, чтобы избежать нескольких поисков, поэтому страницам не придется искать данные каждый раз при перезагрузке страницы. Также, если вам нужно обновить данные, вам не нужно каждый раз отправлять новое приложение. Использование HttpClient довольно просто, если вам нужны примеры, пожалуйста, дайте мне знать

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