Импортировать готовую ДБ в андроид приложение

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Frai
Сообщения: 34
Зарегистрирован: 24 дек 2013, 07:38

Импортировать готовую ДБ в андроид приложение

Сообщение Frai » 28 дек 2013, 10:28

Как можно импортировать готовую БД в андроид приложение?

Аватара пользователя
alexmedv
Сообщения: 29
Зарегистрирован: 29 май 2013, 12:55

Re: Импортировать готовую ДБ в андроид приложение

Сообщение alexmedv » 28 дек 2013, 10:34

Засунуть её в папку assest предварительно сконвертировав если требуется.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Импортировать готовую ДБ в андроид приложение

Сообщение altwin » 28 дек 2013, 12:03

Frai писал(а):Как можно импортировать готовую БД в андроид приложение?
Ваш файл базы должен находится в папке assets, далее:

Код: Выделить всё

public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.myContext = context;

        boolean dbExists = checkDatabase();
        if (dbExists) {
            Log.i(LOGTAG, "DbHelper.constructor: database exists");
        }else {
            try{
                createDatabase();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
конструктор класса DbHelper получает на вход контекст приложения и проверяет существует ли база, создает ее либо что -то еще делает. сheckDatabase:

Код: Выделить всё

private boolean checkDatabase() {
        boolean checkdb = false;
        try {
            String myPath = DATABASE_PATH + DATABASE_NAME;
            File dbFile = new File(myPath);
            checkdb = dbFile.exists();
        } catch (SQLiteException e) {
            Log.e(LOGTAG, "checkDatabase(): Database doesn't exist");
        }

        return checkdb;
    }
сам метод сreateDatabase:

Код: Выделить всё

private void createDatabase() throws IOException{
        boolean dbExists = checkDatabase();
        if (dbExists){
            Log.i(LOGTAG, "createDatabase(): database exists");
        }else {
            this.getReadableDatabase();
            try{
                copyDatabase();
            } catch (IOException e) {
                e.printStackTrace();
                throw new Error("Error copying database");
            }
        }
    }
и метод сopyDatabase:

Код: Выделить всё

private void copyDatabase() throws IOException{

        // Open your local db as the input stream
        InputStream input = myContext.getAssets().open(DATABASE_NAME);
        // Path to the just created empty db
        @SuppressWarnings("unused")
        String outFilename = DATABASE_PATH + DATABASE_NAME;

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

        // transfer byte to input file to output file
        byte[] buffer = new byte[1024];
        int length;
        while ((length = input.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }

        // Close the streams
        output.flush();
        output.close();
        input.close();

    }
вот и все, от вас нужно только создать объект класса DbHelper - база с копируется, ну и объявить правильно константы имя/версия бд, + пусть с учетом имени вашего приложения, т.е. "data/data/your.project_package_name/databases/YOUR_DATABASE_HERE". Ну и учитывая, что DbHelper наследуется от SQLiteOpenHelper, придется переопределить методы onCreate и onUprade(можно просто ничего там не делать).
Изображение

Frai
Сообщения: 34
Зарегистрирован: 24 дек 2013, 07:38

Re: Импортировать готовую ДБ в андроид приложение

Сообщение Frai » 28 дек 2013, 13:05

Для чего нужна переменная myContext ?

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Импортировать готовую ДБ в андроид приложение

Сообщение altwin » 28 дек 2013, 13:17

Frai писал(а):Для чего нужна переменная myContext ?
не пробовали перед тем, как задавать вопрос смотреть на код???
InputStream input = myContext.getAssets().open(DATABASE_NAME); я же писал - это контекст приложения который сохраняется в переменной конструктора класса. Нужна она, чтобы получить путь к базе в устройстве.
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Импортировать готовую ДБ в андроид приложение

Сообщение Foenix » 28 дек 2013, 22:03

altwin писал(а):
Frai писал(а):Для чего нужна переменная myContext ?
не пробовали перед тем, как задавать вопрос смотреть на код???
InputStream input = myContext.getAssets().open(DATABASE_NAME); я же писал - это контекст приложения который сохраняется в переменной конструктора класса. Нужна она, чтобы получить путь к базе в устройстве.
приводите код, приводившийся на форуме неоднократно, и удивляетесь вопросам. Слишком много готового.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Frai
Сообщения: 34
Зарегистрирован: 24 дек 2013, 07:38

Re: Импортировать готовую ДБ в андроид приложение

Сообщение Frai » 06 янв 2014, 14:13

altwin писал(а):
Frai писал(а):Для чего нужна переменная myContext ?
не пробовали перед тем, как задавать вопрос смотреть на код???
InputStream input = myContext.getAssets().open(DATABASE_NAME); я же писал - это контекст приложения который сохраняется в переменной конструктора класса. Нужна она, чтобы получить путь к базе в устройстве.
Я не понимаю где она должна быть объявлена и что в ней должно хронится.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Импортировать готовую ДБ в андроид приложение

Сообщение altwin » 06 янв 2014, 14:28

Frai писал(а):
altwin писал(а):
Frai писал(а):Для чего нужна переменная myContext ?
не пробовали перед тем, как задавать вопрос смотреть на код???
InputStream input = myContext.getAssets().open(DATABASE_NAME); я же писал - это контекст приложения который сохраняется в переменной конструктора класса. Нужна она, чтобы получить путь к базе в устройстве.
Я не понимаю где она должна быть объявлена и что в ней должно хронится.
в данном случае она объявлена в классе: public DbHelper(Context context), в конструктор класса передается переменная context. myContext - это локальная переменная класса в которой сохраняется context. Это контекст приложения, контекст - абстрактное понятие, по сути представляющее связь с системой. Т.е. в Android есть куча внутренних констант, в данном случае метод getAssets(), возвращает константное значение, адрес в котором хранится папка assets. Вызывая метод в контексте приложения - подразумевается, что вы ищите папку assets(конкретное значение) своего приложения а не абстрактную константу. Т.е. делать что -то в контексте, как бы подразумевая, пример:
Встретились друзья Вася и Петя. Петя: привет, как дела?Здесь Петя - вызвал метод - как дела? в контексте Васи. Он не называл его явно, но подразумевал. Иначе, даже учитывая что -как дела? нормальный и понятный метод(или вопрос по сути) - ответ на него не возможен, так как нет адресата, т.е. контекста.
Изображение

Frai
Сообщения: 34
Зарегистрирован: 24 дек 2013, 07:38

Re: Импортировать готовую ДБ в андроид приложение

Сообщение Frai » 08 янв 2014, 14:38

у мегя появляется такая ошибка напротив

Код: Выделить всё

 
catch (IOException e){
 
e.printStackTrace(); 
}
Вложения
Безымянный.png
Безымянный.png (148.65 КБ) 8793 просмотра

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Импортировать готовую ДБ в андроид приложение

Сообщение altwin » 08 янв 2014, 17:19

Frai писал(а):у мегя появляется такая ошибка напротив

Код: Выделить всё

 
catch (IOException e){
 
e.printStackTrace(); 
}
скорее всего потому, что не реализован метод createDatabase(), который и должен бросать это исключение.
Изображение

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Импортировать готовую ДБ в андроид приложение

Сообщение anber » 08 янв 2014, 18:00

когда-то была проблема что нельзя из assest вычитать базу размером больше 1Мб, и бросалось исключение IOException ( http://stackoverflow.com/questions/2860 ... ets-folder ), но кажется в андроид 2.3 это пофиксили.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

eremeev.dev
Сообщения: 6
Зарегистрирован: 14 янв 2014, 01:01

Re: Импортировать готовую ДБ в андроид приложение

Сообщение eremeev.dev » 14 янв 2014, 01:10

Есть отличный проект на гитхабе https://github.com/jgilfelt/android-sqlite-asset-helper

Frai
Сообщения: 34
Зарегистрирован: 24 дек 2013, 07:38

Re: Импортировать готовую ДБ в андроид приложение

Сообщение Frai » 14 янв 2014, 04:38

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

Код: Выделить всё

01-14 12:34:04.529: E/AndroidRuntime(18854): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pokitarmy/com.example.pokitarmy.MainActivity}: android.database.sqlite.SQLiteException: no such table: SpaceMarines: , while compiling: SELECT * FROM SpaceMarines

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Импортировать готовую ДБ в андроид приложение

Сообщение Foenix » 14 янв 2014, 07:14

ну и что? нету тебя таблицы с таким названием.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Frai
Сообщения: 34
Зарегистрирован: 24 дек 2013, 07:38

Re: Импортировать готовую ДБ в андроид приложение

Сообщение Frai » 14 янв 2014, 12:47

В том то и дело что она есть

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Импортировать готовую ДБ в андроид приложение

Сообщение Foenix » 14 янв 2014, 14:01

ну попробуй вывести в лог все имеющиеся таблицы. Может не туда обращение идет. Но таблицы такой у тебя нет.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить