Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
BargystVelp
2 / 2 / 2
Регистрация: 18.07.2017
Сообщений: 46
1

Загрузка базы данных из файла, в классе SQLite БД

07.08.2017, 16:11. Просмотров 976. Ответов 8
Метки нет (Все метки)

Здравствуйте.
Есть метод loadBDOfWordsToList(), который из текстового файла читает слова и добавляет их в коллекцию.
Нужно перенести его из метода onCreate() в класс DBHelper и вызывать его только в случае, если версия базы данных обновилась.
Если тупо перенести его в класс DBHelper в метод onCreate(SQLiteDatabase db) то выскакивает эксепшен, в котором говорится, что только основной класс имеет доступ к ресурсам.
В данном случае я при открытии приложения, вызываю метод по загрудки БД и передаю в конструкторе коллекцию базой, а в DBHelper-e читаю слова с коллекции и добавляю их в 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
 
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.d(LOG_TAG, "Poet Helper Включили приложение.");
 
        //Загрузили БД (НУЖНО ПЕРЕДЕЛАТЬ, РЕАЛИЗАЦИЯ ПЛОХАЯ)
        try {
            loadBDOfWordsToList();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        //Создаю объект БД и передаю в него контекст и БД ArrayList
        dbHelper = new DBHelper(this, dataBaseInWords);
        database = dbHelper.getReadableDatabase();
    }
 
//Заполнение Листа словами из файла.
    public void loadBDOfWordsToList() throws IOException {
        InputStream inputStream = getResources().openRawResource(R.raw.data_base_of_words);
        BufferedReader fileReader = new BufferedReader(new InputStreamReader(inputStream));
        String stringLine;
 
        while ((stringLine = fileReader.readLine()) != null) {
            dataBaseInWords.add(stringLine.trim());
        }
        inputStream.close();
        fileReader.close();
    }
 
public class DBHelper extends SQLiteOpenHelper {
 
    //В листе содержиттся база данных в текстовом формате, нам она нужна для заполнение базы SQL
    private ArrayList<String> list = new ArrayList<String>();
 
    //Для логов
    private final String LOG_TAG = "myLogs";
 
    //Константы версии БД, имени БД и имени столбцов
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "wordsDb";
    public static final String TABLE_WORDS = "words";
 
    //Константа для доступа к словам таблицы.
    public static final String KEY_WORD = "word";
 
    //Конструктор! Создаем БД с переданными параметрами.
    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
 
    //Если БД создается впервый раз, то передаем в нее базу данных из файла для заполнения.
    public DBHelper(Context context, ArrayList list) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.list = list;
        Log.d(LOG_TAG, "DBHelper КОНСТРУКТОР! В листе " + list.size() + " строк!");
    }
 
    //Метод для создания SQL Базы.
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_WORDS + "("
        + KEY_WORD + " text" + ")");
 
        Log.d(LOG_TAG, "DBHelper База впервые создается.");
        Log.d(LOG_TAG, "DBHelper Запускаем цикл.");
 
        ContentValues contentValues = new ContentValues();
        try {
            db.beginTransaction();
            for (int i = 0; i < list.size(); i++) {
                contentValues.clear();
                contentValues.put(KEY_WORD, list.get(i));
                db.insert(TABLE_WORDS, null, contentValues);
            }
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
        Log.d(LOG_TAG, "DBHelper База данных успешно заполнилась.");
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists " + TABLE_WORDS);
        onCreate(db);
    }
 
    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists " + TABLE_WORDS);
        onCreate(db);
    }
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2017, 16:11
Ответы с готовыми решениями:

Постолбцовое отображение данных из базы данных SQLite
Уважаемые форумчане, помогите пожалуйста. Необходимо вывести данные из таблицы базы данных в...

Восстановить поврежденный файл базы данных SQLite (сделать дамп запароленного файла базы данных)
Вообщем не понятно после чего перестал открываться файл базы данных с ошибкой - &quot;database disk...

Загрузка данных из базы firebird и формирование XML файла
Задача считать данные из базы с расширением gdb после чего загрузить их в XML файл. Помогите...

Загрузка данных из файла txt в определенные столбцы базы
Имеется строка Ф.И.О ДАТА РОЖДЕНИЯ ВОЗРАСТ нужно чтобы она автоматически вносилась в бд sql...

Загрузка файла в sqlite и чтение
Как загрузить файл в sqlite а потом его открыть и прочитать?

8
vxg
Модератор
3278 / 2075 / 327
Регистрация: 13.01.2012
Сообщений: 8,057
07.08.2017, 18:22 2
BargystVelp, сделайте наследника application и поместите базу в его статическое поле, сам класс базы может быть оформлен отдельным файлом, если нужен контекст - передайте ему контекст равный контексту наследника application
1
BargystVelp
2 / 2 / 2
Регистрация: 18.07.2017
Сообщений: 46
07.08.2017, 19:44  [ТС] 3
че та я тут намудрил.... в итоге такой эксепшн в момент создания объекта класса ApplicationDB.
NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
Не очень понял, как правильно это сделать.

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
119
120
121
122
123
124
125
126
127
package com.bargystvelp.poethelper;
 
import android.app.Application;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
 
/**
 * Created by BargystVelp on 07.08.2017.
 */
 
public class ApplicationDB extends Application {
 
    //Лист хранит базу всех слов. (ИСПОЛЬЗУЕТСЯ ПРИ ОБНОВЛЕНИИ БАЗЫ)
    public static ArrayList<String> dataBaseInWords = new ArrayList<String>();
 
    public ApplicationDB() {
        //Загрузили БД (НУЖНО ПЕРЕДЕЛАТЬ, РЕАЛИЗАЦИЯ ПЛОХАЯ)
        try {
            loadBDOfWordsToList();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    //Заполнение Листа словами из файла.
    public void loadBDOfWordsToList() throws IOException {
        InputStream inputStream = getResources().openRawResource(R.raw.data_base_of_words);
        BufferedReader fileReader = new BufferedReader(new InputStreamReader(inputStream));
        String stringLine;
 
        while ((stringLine = fileReader.readLine()) != null) {
            dataBaseInWords.add(stringLine.trim());
        }
        inputStream.close();
        fileReader.close();
    }
 
    public static ArrayList<String> getDataBaseInWords() {
        return dataBaseInWords;
    }
}
 
package com.bargystvelp.poethelper;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
 
import java.io.IOException;
import java.util.ArrayList;
 
/**
 * Created by BargystVelp on 13.06.2017.
 */
 
public class DBHelper extends SQLiteOpenHelper {
 
    //В листе содержиттся база данных в текстовом формате, нам она нужна для заполнение базы SQL
    private static ArrayList<String> list = new ArrayList<String>();
 
    //Для логов
    private final String LOG_TAG = "myLogs";
 
    //Константы версии БД, имени БД и имени столбцов
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "wordsDb1";
    public static final String TABLE_WORDS = "words";
 
    //Константа для доступа к словам таблицы.
    public static final String KEY_WORD = "word";
 
    //Конструктор! Создаем БД с переданными параметрами.
    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
 
    /*//Если БД создается впервый раз, то передаем в нее базу данных из файла для заполнения.
    public DBHelper(Context context, ArrayList list) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.list = list;
        Log.d(LOG_TAG, "DBHelper КОНСТРУКТОР! В листе " + list.size() + " строк!");
    }*/
 
    //Метод для создания SQL Базы.
    @Override
    public void onCreate(SQLiteDatabase db) {
        new ApplicationDB();
        list = ApplicationDB.getDataBaseInWords();
        db.execSQL("create table " + TABLE_WORDS + "("
                + KEY_WORD + " text" + ")");
 
        Log.d(LOG_TAG, "DBHelper База впервые создается.");
        Log.d(LOG_TAG, "DBHelper Запускаем цикл.");
 
        ContentValues contentValues = new ContentValues();
        try {
            db.beginTransaction();
            for (int i = 0; i < list.size(); i++) {
                contentValues.clear();
                contentValues.put(KEY_WORD, list.get(i));
                db.insert(TABLE_WORDS, null, contentValues);
            }
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
        Log.d(LOG_TAG, "DBHelper База данных успешно заполнилась.");
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists " + TABLE_WORDS);
        onCreate(db);
    }
 
    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists " + TABLE_WORDS);
        onCreate(db);
    }
}
Добавлено через 19 минут
в 93-й строчке.
0
vxg
Модератор
3278 / 2075 / 327
Регистрация: 13.01.2012
Сообщений: 8,057
08.08.2017, 08:19 4
BargystVelp, не понимаю к чему этот ад? Зачем new висящий в воздухе? Зачем создание application? Его должна создать сама система - пропишите в манифест в name имя класса - вам он нужен просто как надежное место хранения статики.
0
BargystVelp
2 / 2 / 2
Регистрация: 18.07.2017
Сообщений: 46
09.08.2017, 16:03  [ТС] 5
Я не врубаюсь..
Мне нужно по факту, перенести метод loadBDOfWordsToList() в метод класса DBHelper. Там я его вызвать не могу так как класс не имеет доступа к папке res/raw. Наследоваться этим классом я тоже не могу, так как он и так наследуется от класса SQLiteOpenHelper. Я знаю, что если переделать коллекцию в статику, то она будет доступна всем классам, но суть проблемы не в том, чтобы организовать надежное хранилище, а в том, чтобы метод вызывался только в случае, если версия БД поменялась, а не каждый раз при запуске активити.
0
ExFau$t
686 / 575 / 133
Регистрация: 08.05.2012
Сообщений: 2,836
09.08.2017, 16:15 6
Использовать метод onUpgrade, не?
0
BargystVelp
2 / 2 / 2
Регистрация: 18.07.2017
Сообщений: 46
09.08.2017, 16:25  [ТС] 7
ExFau$t, В классе DBHelper?

Добавлено через 5 минут
В таком случае метод getResources() подсвечивается красным.
InputStream inputStream = getResources().openRawResource(R.raw.data_base_of_words);
0
ExFau$t
686 / 575 / 133
Регистрация: 08.05.2012
Сообщений: 2,836
09.08.2017, 17:11 8
Лучший ответ Сообщение было отмечено BargystVelp как решение

Решение

Java
1
context.getResources()...
1
BargystVelp
2 / 2 / 2
Регистрация: 18.07.2017
Сообщений: 46
09.08.2017, 18:05  [ТС] 9
ExFau$t, Да, все работает. Спасибо!
0
09.08.2017, 18:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2017, 18:05

Написать функции для считывания данных о выбранных сущностях из базы данных SQLite
Здравствуйте, помогите доделать программу. Надо написать функции для считывания данных о...

Загрузка файла на сервер, добавление в базу данных ссылки и вывод ссылки из базы
Добрый вечер. Изучаю php, появился вопрос, а решить уже дня 3 не могу своими силами, поэтому прошу...

Построчное считывание данных из базы данных SQLite
Всем привет) Столкнулась с такой проблемой: получаю данные из бд SQLite через SQLiteDataReader с...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru