Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Alexvsalex
7 / 7 / 4
Регистрация: 22.04.2015
Сообщений: 73
#1

Работа с готовой SQLite базой на андроид - Android

17.07.2015, 17:19. Просмотров 635. Ответов 2
Метки нет (Все метки)

Здравствуйте!
Пытаюсь подключить готовую sqlite базу с помощью этого кода, взятого из интернета:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package com.alexvsalex.HelpforMath;
 
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
 
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
public class SQLite extends SQLiteOpenHelper {
 
    // путь к базе данных вашего приложения
    private static String DB_PATH = "/data/data/com.alexvsalex.HelpforMath/databases/";
    private static String DB_NAME = "android";
    private SQLiteDatabase myDataBase;
    private final Context mContext;
 
    /**
     * Конструктор
     * Принимает и сохраняет ссылку на переданный контекст для доступа к ресурсам приложения
     * @param context
     */
    public SQLite(Context context) {
        super(context, DB_NAME, null, 1);
        this.mContext = context;
    }
 
    /**
     * Создает пустую базу данных и перезаписывает ее нашей собственной базой
     * */
    public void createDataBase() throws IOException {
 
        if(!checkDataBase()){
            this.getReadableDatabase();
 
            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }
 
    /**
     * Проверяет, существует ли уже эта база, чтобы не копировать каждый раз при запуске приложения
     * @return true если существует, false если не существует
     */
    private boolean checkDataBase(){
        SQLiteDatabase checkDB;
 
        try{
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
            checkDB.close();
            return true;
        }catch(SQLiteException e){
            return false;
        }
    }
 
    /**
     * Копирует базу из папки assets заместо созданной локальной БД
     * Выполняется путем копирования потока байтов.
     * */
    private void copyDataBase() throws IOException{
        //Открываем локальную БД как входящий поток
        InputStream myInput = mContext.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);
    }
 
    @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) {
    }
 
    public Cursor dataDirect(String s){
        openDataBase();
        return myDataBase.query(s,new String[]{"Name", "Location"},null,null,null,null,null);
    }
}
Вызываю его вот так:
Java
1
2
3
4
5
6
try {
            SQLite myDbHelper = new SQLite(this);
            myDbHelper.createDataBase();
        } catch (IOException ioe) {
            throw new Error("Unable to create database");
        }
android.db находится в /assets/
Лог:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
07-17 14:00:37.724    1146-1146/com.alexvsalex.HelpforMath I/SqliteDatabaseCpp﹕ sqlite returned: error code = 14, msg = cannot open file at line 27701 of [8609a15dfa], db=/data/data/com.alexvsalex.HelpforMath/databases/android
07-17 14:00:37.724    1146-1146/com.alexvsalex.HelpforMath I/SqliteDatabaseCpp﹕ sqlite returned: error code = 14, msg = os_unix.c: open() at line 27701 - "" errno=2 path=/data/data/com.alexvsalex.HelpforMath/databases/android, db=/data/data/com.alexvsalex.HelpforMath/databases/android
07-17 14:00:37.724    1146-1146/com.alexvsalex.HelpforMath E/SqliteDatabaseCpp﹕ sqlite3_open_v2("/data/data/com.alexvsalex.HelpforMath/databases/android", &handle, 1, NULL) failed
07-17 14:00:37.754    1146-1146/com.alexvsalex.HelpforMath E/SQLiteDatabase﹕ Failed to open the database. closing it.
    android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
            at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
            at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1013)
            at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
            at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:962)
            at com.alexvsalex.HelpforMath.SQLite.checkDataBase(SQLite.java:58)
            at com.alexvsalex.HelpforMath.SQLite.createDataBase(SQLite.java:38)
            at com.alexvsalex.HelpforMath.DirectoryActivity.onCreate(DirectoryActivity.java:47)
            at android.app.Activity.performCreate(Activity.java:4465)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
            at android.app.ActivityThread.access$600(ActivityThread.java:123)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4424)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
            at dalvik.system.NativeStart.main(Native Method)
07-17 14:00:37.813    1146-1146/com.alexvsalex.HelpforMath D/AndroidRuntime﹕ Shutting down VM
07-17 14:00:37.813    1146-1146/com.alexvsalex.HelpforMath W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
07-17 14:00:37.864    1146-1146/com.alexvsalex.HelpforMath E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.Error: Error copying database
            at com.alexvsalex.HelpforMath.SQLite.createDataBase(SQLite.java:44)
            at com.alexvsalex.HelpforMath.DirectoryActivity.onCreate(DirectoryActivity.java:47)
            at android.app.Activity.performCreate(Activity.java:4465)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
            at android.app.ActivityThread.access$600(ActivityThread.java:123)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4424)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
            at dalvik.system.NativeStart.main(Native Method)
07-17 14:00:37.934    1146-1149/com.alexvsalex.HelpforMath D/dalvikvm﹕ GC_CONCURRENT freed 316K, 7% free 6677K/7111K, paused 4ms+3ms
07-17 14:00:37.944    1146-1156/com.alexvsalex.HelpforMath E/SQLiteDatabase﹕ close() was never explicitly called on database '/data/data/com.alexvsalex.HelpforMath/databases/android'
    android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
            at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1943)
            at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007)
            at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
            at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1051)
            at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:770)
            at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
            at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
            at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:231)
            at com.alexvsalex.HelpforMath.SQLite.createDataBase(SQLite.java:39)
            at com.alexvsalex.HelpforMath.DirectoryActivity.onCreate(DirectoryActivity.java:47)
            at android.app.Activity.performCreate(Activity.java:4465)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
            at android.app.ActivityThread.access$600(ActivityThread.java:123)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4424)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
            at dalvik.system.NativeStart.main(Native Method)
07-17 14:00:38.174    1146-1151/com.alexvsalex.HelpforMath I/dalvikvm﹕ threadid=3: reacting to signal 3
07-17 14:00:38.184    1146-1151/com.alexvsalex.HelpforMath I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'
07-17 14:00:38.444    1146-1151/com.alexvsalex.HelpforMath I/dalvikvm﹕ threadid=3: reacting to signal 3
07-17 14:00:38.454    1146-1151/com.alexvsalex.HelpforMath I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'
07-17 14:02:51.833    1146-1146/com.alexvsalex.HelpforMath I/Process﹕ Sending signal. PID: 1146 SIG: 9
Пробовал выносить в отдельный поток - не помогло.
В чем причина ошибки?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2015, 17:19     Работа с готовой SQLite базой на андроид
Посмотрите здесь:

Андроид, работа с камерой Android
Android Андроид БД
Android Импорт готовой базы в приложение
Android Использование готовой базы SqLite из ресурсов
Android Конусультация в написании приложения(работа с базой, сложение и сохранение результата)
работа для программиста андроид. Читалка Android
Работа с базой данных Android
Работа с базой SQLite: чем нужно пользоваться вместо SimpleCursorLoader? Android
Всплывающие диалоги и работа с базой данных Android
Android Подключиться к готовой базе данных
SQLite Андроид эмулятор и Железо по разному обрабатывают запросы Android
Android Работа с SQLite

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
schdub
2933 / 1277 / 235
Регистрация: 19.01.2009
Сообщений: 3,321
Завершенные тесты: 1
17.07.2015, 23:05     Работа с готовой SQLite базой на андроид #2
Alexvsalex, можно при первом использовании скопировать ее в /data/data/com.alexvsalex.HelpforMath/databases/, а потом уже открывать как обычно.

http://stackoverflow.com/questions/2...m-asset-folder
http://stackoverflow.com/questions/5...ith-a-database

Добавлено через 5 минут
У вас файл android.db, а DB_NAME просто "android".
Alexvsalex
7 / 7 / 4
Регистрация: 22.04.2015
Сообщений: 73
18.07.2015, 08:33  [ТС]     Работа с готовой SQLite базой на андроид #3
Пробовал, и "android", и "android.db" - эффекта нет.
Заметил вот такую вещь: при первом запуске приложения оно выдает ошибку, и в папке databases появляется база. После этого запускается нормально, но это не мой файл, потому что у меня база с одной таблицей "android_metadata", одной колонкой "locale", и одной записью "en_US", а там с записью "ru_RU".
Yandex
Объявления
18.07.2015, 08:33     Работа с готовой SQLite базой на андроид
Ответ Создать тему
Опции темы

Текущее время: 15:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru