Считывание базы данных из assets в intellij idea.

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
plastex
Сообщения: 10
Зарегистрирован: 12 июл 2013, 00:38

Считывание базы данных из assets в intellij idea.

Сообщение plastex » 20 фев 2014, 21:26

Разрабатываю приложение, до недавнего времени в БД не нуждался, но теперь есть необходимость ее подключить. Проблема в том, что не удается открыть саму базу данных. Ругается именно на метод openDataBase. Ссылаюсь на то, что в intellij idea проект имеет другую структуру и папка Data попросту отсутствует. Код был найден в интернете и судя по комментариям, он работает у всех, за исключением меня.(
Файл базы под названием RU_EN.db лежит в папке assets.

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


import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.io.*;

public class DataBaseHelper extends SQLiteOpenHelper {


    //стандартный системный путь к базе данных приложения

    private static String DB_PATH = "data/data/com.easyenglish/databases/";
    private static String DB_NAME = "RU_EN";
    private SQLiteDatabase myDataBase;
    private final Context myContext;
    public Cursor RU_Short_EN, RU_Full_EN;



    /**
     * Конструктор
     * <p/>
     * Принимает и сохраняет ссылку на переданный контекст для доступа к ресурсам приложения
     *
     * @param context
     */

    public DataBaseHelper(Context context) {

        super(context, DB_NAME, null, 1);

        this.myContext = context;

    }


    /**
     * Создает пустую базу данных и перезаписывает ее нашей собственной базой
     */

    public void createDataBase() throws IOException {

        boolean dbExist = checkDataBase();

        if (dbExist) {

            //ничего не делать - база уже есть

        } else {

            //вызывая этот метод создаем пустую базу, позже она будет перезаписана

            this.getReadableDatabase();

            try {

                copyDataBase();

            } catch (IOException e) {

                throw new Error("Error copying database");

            }
        }
    }

    /**
     * Проверяет, существует ли уже эта база, чтобы не копировать каждый раз при запуске приложения
     *
     * @return true если существует, false если не существует
     */

    private boolean checkDataBase() {
        File dbFile = new File(DB_PATH + DB_NAME);
        return dbFile.exists();

    }


    /**
     * Копирует базу из папки assets заместо созданной локальной БД
     * <p/>
     * Выполняется путем копирования потока байтов.
     */

    private void copyDataBase() throws IOException {


        //Открываем локальную БД как входящий поток

        InputStream myInput = myContext.getAssets().open(DB_NAME);

        //Путь ко вновь созданной БД

        String outFileName = DB_PATH + DB_NAME;

        //Открываем пустую базу данных как исходящий поток

        OutputStream myOutput = new FileOutputStream(outFileName);

        //перемещаем байты из входящего файла в исходящий

        byte[] buffer = new byte[1024];

        int length;

        while ((length = myInput.read(buffer)) > 0) {

            myOutput.write(buffer, 0, length);
        }
        //закрываем потоки
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }


    public void openDataBase() throws SQLException {

        //открываем БД

        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    }

    public void ReadDataBaseRU_Short_EN() throws SQLException {

        String[] columns_word_short=new String[] {"word","short"};
        //String[] columns_word_full = new String[] { "word", "full" };
        String  groupBy = "word";
        RU_Short_EN = this.getWritableDatabase().query("RU_EN", columns_word_short, null, null, groupBy, null, null);
       // RU_Full_EN= this.getWritableDatabase().query("RU_EN",columns_word_full,null,null,groupBy,null,null);
        //return RU_Short_EN;

    };

    @Override
    public synchronized void close() {

        if (myDataBase != null)
            myDataBase.close();
        super.close();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

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

Re: Считывание базы данных из assets в intellij idea.

Сообщение Foenix » 20 фев 2014, 21:30

перестаньте искать связь между средой разработки и структурой данных на устройстве Андроид.
Ошибку нужно искать в логе.
R.id.team

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

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

Re: Считывание базы данных из assets в intellij idea.

Сообщение Foenix » 20 фев 2014, 21:31

Как называется ваш пакет с программой?
R.id.team

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

plastex
Сообщения: 10
Зарегистрирован: 12 июл 2013, 00:38

Re: Считывание базы данных из assets в intellij idea.

Сообщение plastex » 20 фев 2014, 21:32

com.easyenglish

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

Re: Считывание базы данных из assets в intellij idea.

Сообщение Foenix » 20 фев 2014, 21:34

ты говоришь, что база данных названа как
RU_EN.db
а у самого
private static String DB_NAME = "RU_EN";
По твоему, это одно и то же?
R.id.team

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

plastex
Сообщения: 10
Зарегистрирован: 12 июл 2013, 00:38

Re: Считывание базы данных из assets в intellij idea.

Сообщение plastex » 20 фев 2014, 21:40

пробовал дописывать расширение, ничего не менялось. вот лог:

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

02-20 18:38:47.311    2423-2423/com.easyenglish E/SQLiteLog﹕ (14) cannot open file at line 30191 of [00bb9c9ce4]
02-20 18:38:47.311    2423-2423/com.easyenglish E/SQLiteLog﹕ (14) os_unix.c:30191: (2) open(//data/data/com.easyenglish/databases/RU_EN.db) -
02-20 18:38:47.327    2423-2423/com.easyenglish E/SQLiteDatabase﹕ Failed to open database 'data/data/com.easyenglish/databases/RU_EN.db'.
    android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
            at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
            at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
            at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
            at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
            at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
            at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
            at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
            at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
            at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
            at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
            at com.easyenglish.DataBaseHelper.openDataBase(DataBaseHelper.java:154)
            at com.easyenglish.DictActivity.LoadDict(DictActivity.java:33)
            at com.easyenglish.DictActivity.onCreate(DictActivity.java:63)
            at android.app.Activity.performCreate(Activity.java:5133)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
02-20 18:38:47.347    2423-2423/com.easyenglish E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.easyenglish/com.easyenglish.DictActivity}: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
            at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
            at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
            at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
            at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
            at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
            at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
            at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
            at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
            at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
            at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
            at com.easyenglish.DataBaseHelper.openDataBase(DataBaseHelper.java:154)
            at com.easyenglish.DictActivity.LoadDict(DictActivity.java:33)
            at com.easyenglish.DictActivity.onCreate(DictActivity.java:63)
            at android.app.Activity.performCreate(Activity.java:5133)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

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

Re: Считывание базы данных из assets в intellij idea.

Сообщение Foenix » 20 фев 2014, 21:47

устройство рутовано?
попробуй запустить на эмуляторе (если не рутовано) и посмотреть после копирования есть ли база данных в папке приложения.
ошибку тут выдает
at com.easyenglish.DictActivity.LoadDict(DictActivity.java:33)
R.id.team

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

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

Re: Считывание базы данных из assets в intellij idea.

Сообщение Foenix » 20 фев 2014, 21:51

измени на нормальное имя бд (с расширением). Удали приложение, поставь заново (т.к. во второй раз у тебя база может не создасться) ПРоверь наличие скопированной бд

вот тут
private boolean checkDataBase() {
File dbFile = new File(DB_PATH + DB_NAME);
**************************************
return dbFile.exists();

}
выдай в лог сообщение есть бд или нет. ПОсмотри лог.
R.id.team

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

plastex
Сообщения: 10
Зарегистрирован: 12 июл 2013, 00:38

Re: Считывание базы данных из assets в intellij idea.

Сообщение plastex » 20 фев 2014, 22:02

дело в том, что у меня айфон :D и все приложения я запускаю на эмуляторе. рута, естественно, нет. в той строке находится лишь вызов метода openDataBase.
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); вот эта строка ему не нравится. и т.к. потом ругается на то, что не может открыть БД, то проблема, видимо, в пути.
С файлом же все хорошо, пробовал создавать новый чистый девайс, на нем тоже пишет, что не удается открыть БД.

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

Re: Считывание базы данных из assets в intellij idea.

Сообщение Foenix » 20 фев 2014, 22:06

причем тут гадания? если эмулятор - то посмотри есть ли в папке data/data... указанный файл. Для этого воспользуйся какими-то средствами среды программирования типа какого-нибудь эксплорера.

Зачем писать про айфон? это как-то относится к делу?
рут на эмуляторе не нужен - там и так все файлы посмотреть можно и скопировать туда и обратно любой файл в любую папку.
R.id.team

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

plastex
Сообщения: 10
Зарегистрирован: 12 июл 2013, 00:38

Re: Считывание базы данных из assets в intellij idea.

Сообщение plastex » 20 фев 2014, 22:09

Файла нет. Про яблоко написал к тому, что тестирую приложение на эмуляторе.

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

Re: Считывание базы данных из assets в intellij idea.

Сообщение Foenix » 20 фев 2014, 22:14

тогда бери и дебаггом проходи эти процедуры и выясняй что у тебя там происходит и почему ветка не идет на копирование файла. Может его в assets нету ))) я же не вижу что ты там сделал
R.id.team

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

plastex
Сообщения: 10
Зарегистрирован: 12 июл 2013, 00:38

Re: Считывание базы данных из assets в intellij idea.

Сообщение plastex » 20 фев 2014, 22:17

myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); ну ему не нравится именно эта строчка. по идее, неправильный путь, только в чем его неправильность, непонятно. файл лежит в assets, пробовал переименовывать в ruen.db, ничгео не изменилось.

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

Re: Считывание базы данных из assets в intellij idea.

Сообщение Foenix » 20 фев 2014, 22:27

я же тебе сказала..
у тебя ошибка в процедуре
at com.easyenglish.DictActivity.LoadDict(DictActivity.java:33)
там открытие базы (которой как ты говоришь нет, то есть не создалась)! т.е. это уже ветка дальше пошла - на загрузку каких-то твоих словарей или что у тебя там!
а тебе нужно то, что делаться должно вначале - проверка существования базы данных и ее копирование. Ты вывел в лог?
R.id.team

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

plastex
Сообщения: 10
Зарегистрирован: 12 июл 2013, 00:38

Re: Считывание базы данных из assets в intellij idea.

Сообщение plastex » 20 фев 2014, 22:36

Все, я разобрался :) Суть была в том, что я сразу запускал в коде метод открытия базы, а ведь последовательность иная. Сначала открывается локальная бд, потом она копируется, а ТОЛЬКО ПОТОМ нужно было запускать метод ее открытия. В общем, немного не так понял суть методов и потому была проблема.

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

Re: Считывание базы данных из assets в intellij idea.

Сообщение Foenix » 20 фев 2014, 22:43

Да уж.
R.id.team

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

Ответить