Действительно ли необходимо создавать таблицы SQLite при каждом запуске приложения? - PullRequest
4 голосов
/ 29 марта 2012

В нескольких руководствах по SQLite я заметил, что таблица воссоздается в событии onCreate() класса, который расширяет SQLiteOpenHelper.Я уже создал свою базу данных и таблицы SQLite вне среды Android (Eclipse IDE) с помощью надстройки Firefox.Таблицы базы данных находятся в ожидаемом месте:

C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic_Project\assets

Мне кажется странным, что мне придется каждый раз воссоздавать их программно (очевидно, они продолжаютсуществовать и хранить данные, или какой в ​​этом смысл)?Тем не менее, у меня сейчас серьезная проблема с этим приложением, что приводит меня к моему вопросу:

  • Действительно ли необходимо каждый раз напоминать Android о базе данных?

К большому огорчению, я просто понял, что вместо создания таблиц базы данных в C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic_Project\assets я поместил их в C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic\assets, которая была более ранней версией приложения, но при этом копировал файл SQLite.в правильном месте ничего не изменило.Если это и является причиной проблемы, поскольку мое приложение ищет базу данных AWOL, разве недостаточно просто скопировать и вставить файл?Должен ли я что-то сделать, чтобы официально ввел базу данных в каталог system/Android/Eclipse?Есть предложения?

Ответы [ 3 ]

5 голосов
/ 29 марта 2012

Я думаю, вы здесь недопонимание.Когда объект SQLiteOpenHelper создан, он проверит, существует база данных SQLite или нет, если нет, то вызовет метод onCreate () (где обычно разработчики реализуют SQL для создания базы данных)

Обновление:@Clay Shannon: я объясню механизм работы проекта Eclipse и Android.Допустим, вы используете Eclipse для программирования Android-проекта.Новый проект создаст папку проекта в рабочей области (в вашем случае это C: \ aXX3 & Space \ Android \ workspace , а папка проекта - OnDemandAndAutomatic_Project ).Эта папка будет содержать несколько подпапок, таких как: src, bin, assets, res, ... Каждая папка имеет свою роль, и вас интересует папка assets, верно?Папка Assets используется для хранения справочных файлов (которые нельзя или вы не хотите помещать в папку res), таких как: html-файл, звуковой файл, файл изображений, текстовый файл ... Когда Eclipse создает apk из проекта,эти файлы также включены в апк.Когда вы устанавливаете apk на устройстве Android, apk копируется в системную папку Android, а также создается папка с данными приложения, как упоминал Дхармендра: / data / data / {packagename} / (имя пакета, например com.google.app и т. Д., И этот путь предназначен для вашей ОС Android вашего устройства, а не для Windows).

В данном случае вы хотите использовать уже существующую базу данных,поэтому вам необходимо реализовать функцию, которая проверяет, существует ли ваша база данных или нет, если нет, скопируйте вашу базу данных в путь к базе данных / data / data / {packagename} / database / , ивызовите эту функцию при запуске приложения.А как это сделать уже здесь ответили Как скопировать существующую базу данных из одного приложения в другое .Также здесь есть ссылка для доступа к файлам ресурсов, если вы не знаете http://www.wiseandroid.com/post/2010/06/14/Android-Beginners-Intro-to-Resources-and-Assets.aspx

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

4 голосов
/ 29 марта 2012

На самом деле SQLiteOpenHelper отвечает за создание вашей базы данных, обновление и многое другое. Если вы хотите создавать таблицы программно, вам нужно написать запросы на создание таблиц в методе onCreate класса SQLiteOpenHelper. Если вы хотите обновить свою базу данных после ранее созданной базы данных, вы можете записать запросы модифицированной таблицы только в методе onUpgrade вам придется изменить версию базы данных.

Если вы уже создали базу данных внешне и если вы хотите использовать эту базу данных, вам нужно поместить эту базу данных в папку ресурсов и скопировать этот файл в папку баз данных, которая находится в папке /data/data/packagename/databases.

вот пример для копирования базы данных из ресурсов в папку базы данных

private static boolean copyDataBase(Context c) throws IOException {
    String DB_PATH = "/data/data/" + c.getPackageName() + "/databases/";
    AssetManager mg = c.getResources().getAssets();
    InputStream myInput = null;

    try {
        myInput = mg.open(DATABASE_NAME);

    } catch (IOException ex) {
        return false;
    }

    if (myInput != null) {
        String outFileName = DB_PATH + DATABASE_NAME;
        OutputStream myOutput = new FileOutputStream(outFileName);
        byte[] buffer = new byte[8000];
        int length;

        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
        myOutput.flush();
        myOutput.close();
        myInput.close();

        Log.d(TAG, "Database is copied");
        return true;
    }
    return false;
}

Вот метод проверки баз данных и его версия для копирования

public void copyDatabase() {

    try {
        SharedPreferences preferences = c.getSharedPreferences(c.getPackageName(), Context.MODE_PRIVATE);
        if (checkDataBase(c)) {
            if (preferences.getInt("dbversion", 0) != 0) {
                c.deleteDatabase(DatabaseHelper.DATABASE_NAME);
            }

        }
        getReadableDatabase();
        close();
        if (copyDataBase(c)) {
            Editor editor = preferences.edit();
            editor.putInt("dbversion", DatabaseHelper.DATABASE_VERSION);
            editor.commit();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Вот пример, который проверяет, существует ли база данных или нет?

public static boolean checkDataBase(Context c) {
    File f = new File("/data/data/" + c.getPackageName() + "/databases/"
            + DATABASE_NAME);
    if (!f.exists())
        return false;
    SQLiteDatabase checkDB = null;
    try {
        checkDB = SQLiteDatabase
                .openDatabase("/data/data/" + c.getPackageName()
                        + "/databases/" + DATABASE_NAME, null,
                        SQLiteDatabase.OPEN_READONLY);
        checkDB.close();
    } catch (SQLiteException e) {
        e.printStackTrace();
    }
    return checkDB != null ? true : false;
}
2 голосов
/ 29 марта 2012

Для SQLiteOpenHelper вызывается onCreate(), если база данных не существует.Он вызывается onUpgrade(), если схема базы данных изменилась и нуждается в обновлении.Итак, ответ на ваш вопрос: нет .

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