Предварительно заполненная база данных - приложение для Android - PullRequest
2 голосов
/ 17 июля 2011

У меня реальная проблема с созданием приложения для Android с предварительно заполненной базой данных.

Пожалуйста, взгляните на весь исходный код .

Я создал базу данных, используя sqlitebrowser, и скопировал ее в каталог «assets» в моем приложении Android.

Я добавил код копирования базы данных из каталога ресурсов в класс Java DBAdapter.java

В MainActivity.java я вызвал функцию createDatabase, поэтому, если база данных не существует, она должна скопировать базу данных из каталога активов. После создания базы данных я вызываю функцию getAllContacts и отображаю ее на странице.

Всякий раз, когда я выполняю проект, он выдает ошибку, которую я не могу отладить.

Может кто-нибудь помочь мне решить проблему?

UPDATE:

Logcat показывает следующее исключение. Кажется, таблица "контактов" в assets / MyDB.db не скопирована / не создана, но я не знаю почему.

E/AndroidRuntime(  672): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.me.mydb/org.me.mydb.MainActivity}: android.database.sqlite.SQLiteException: no such table: contacts: , while compiling: SELECT _id, name, email FROM contacts
E/AndroidRuntime(  672):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime(  672):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(  672):        at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(  672):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(  672):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  672):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  672):        at android.app.ActivityThread.main(ActivityThread.java:4627)

Ответы [ 4 ]

2 голосов
/ 17 июля 2011

Вот хорошая ссылка для начала.

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

1 голос
/ 17 июля 2011

Замените строку с надписью copyDBFromResource(); следующим кодом -

        SQLiteDatabase readDB = null; 
        readDB = this.getReadableDatabase();
        readDB.close();
        readDB = null;
        copyDBFromResource();

Я думаю, что это необходимо, потому что ваш код не может сам создавать файлы в папке Data и совершать вызов getReadableDatabase()создаст для вас файл БД.В Android 2.2 и более поздних версиях вам нужно закрыть базу данных после получения дескриптора, иначе копирование не удастся выполнить.

Редактировать:

Если это все еще не работает, попробуйте дать записьРазрешение на внешнее хранилище следующее:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
0 голосов
/ 17 июля 2011

Я использую обработку событий onCreate и набор сценариев * .sql (построчно выполняется в простом цикле).

Это удобно, когда вам также необходимо написать процедуры обновления базы данных. У меня есть один сценарий sql для инициализации новой (обновленной) базы данных и набор сценариев sql для каждой устаревшей версии базы данных.

например. SQL-скрипт «create» вызывается всякий раз, когда требуется инициализировать новую базу данных, или когда каждый пользователь должен обновить свою базу данных с версии, вызывается цепочка сценариев «v1-update-to-v2» и «v2-update-to-v3» 1 до версии 3. Это медленнее, чем один скрипт обновления для каждой версии (например, «v1-update-to-v3» и «v2-update-to-v3»), но эту «цепочку» легче поддерживать, когда я добавляю новые версии (Мне не нужно ничего менять в старых скриптах).

0 голосов
/ 17 июля 2011

Ну, DataHelper поставляется с методом onCreate, вы можете создать базу данных там, где он даже заполнен.

Официальная документация по Android

Вызывается, когда база данныхсоздан впервые.Вот где должно произойти создание таблиц и их начальное заполнение.

на самом деле вы переопределили этот метод

 @Override
        public void onCreate(SQLiteDatabase db)
        {

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