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

Передача данных между классами

18.07.2017, 20:00. Просмотров 926. Ответов 3
Метки нет (Все метки)

Добрый день господа.
Пишу свое первое приложение на андроид, и столкнулся с вот такой проблемой.
Чего я ожидаю от приложения.
В методе onCreate() я подключаюсь к базе данных SQLite.
По нажатию кнопки вызывается метод из другого класса который работает с БД и возвращает мне результат работы в формате String.
Дальше уже не важно.

Что по факту получается.
Через одно место мне удалось реализовать задуманное, но такая реализация на мой взгляд не правильная и если я не ошибаюсь, я по моему создаю 2 базы данных, а не одну.

Что происходит в коде.
В коде я создаю объект dbHelper, по нажатию кнопки создаю объект класса generatorRhymes в котором буду работать с БД и передаю в него context и ArrayList в котором хранится база данных в стринге (Иначе не получается так как база данных изначально храниться в текстовом файле).
В том классе создаю объект dbHelper с context-ом переданным через объект generatorRhymes и ArrayList (получается мне приходится создавать вторую базу данных, а не подключаться к первой).
Далее подключаюсь к базе методом dbHelper.getReadableDatabase(); и уже работаю после этого с базой.
Как я только не извращался с Getter-ами, чтобы подключиться к первой базе, но все безуспешно. Выдает вот такую ошибку.
Process: com.bargystvelp.poethelper, PID: 4411
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase com.bargystvelp.poethelper.DBHelper.getReadableDatabase()' 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
public class PoetHelper extends AppCompatActivity implements View.OnClickListener {
 
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
//Инициализируем кнопку и текст.
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
        editText = (EditText) findViewById(R.id.editText);
 
        //Присвоили переменной context - this.
        context = this;
 
        //Загрузили БД (НУЖНО ПЕРЕДЕЛАТЬ, РЕАЛИЗАЦИЯ ПЛОХАЯ)
        try {
            loadBDOfWordsToList();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        //Создаю объект БД и передаю в него контекст и БД ArrayList (РЕАЛИЗАЦИЯ ПЛОХАЯ
        //НУЖНО ПЕРЕДЕЛАТЬ НО КАК ИНАЧЕ НЕ ЗНАЮ)
        dbHelper = new DBHelper(this, dataBaseInWords);
}
 
 
@Override
    public void onClick(View v) {
        Log.d(LOG_TAG,"Poet Helper Нажали кнопку");
 
        //Записываем в стрингу слово введенное пользователем.
        String word = editText.getText().toString();
 
        //Создали объект и передали в него контекст, чтобы подключиться там к базе SQL.
        //РАБОТАЕТ НЕ КОРЕКТНО! НУЖНО ПЕРЕДЕЛАТЬ!!
        generatorRhymes = new GeneratorRhymes(context,dataBaseInWords);
 
        String rhymes = "";
 
        
        try {
            rhymes = generatorRhymes.getRhymes(word);
            Log.d(LOG_TAG, "Poet Helper Запустили метод getRhymes");
            Log.d(LOG_TAG, "Poet Helper rhymes = " + rhymes);
        } catch (IOException e) {
            e.printStackTrace();
        }
}
 
public class GeneratorRhymes extends PairEndings {
 
    public GeneratorRhymes(Context context, ArrayList<String> dataBaseInWords) {
        this.context = context;
        this.dataBaseInWords = dataBaseInWords;
        Log.d(LOG_TAG, "Generator Rhymes КОНСТРУКТОР!");
    }
 
    ArrayList<String> dataBaseInWords = new ArrayList<String>();
    Context context;
    DBHelper dbHelper;
 
    public String getRhymes(String word) throws IOException {
        //Ненужная в данный момент реализация.
 
        return searchRhymes();
    }
 
 private String searchRhymes() throws IOException {
 
        //ПЕРЕДЕЛАТЬ ПРИНЦИП ДЕЙСТВИЯ!
        dbHelper = new DBHelper(context, dataBaseInWords);
        Log.d(LOG_TAG, "Generator Rhymes подключились к базе.");
 
        SQLiteDatabase database = dbHelper.getReadableDatabase();
        Log.d(LOG_TAG, "Generator Rhymes создали database.");
 
       //Не нужная в данный момент реализация.
 
      return "Слова из SQLite базы."
 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2017, 20:00
Ответы с готовыми решениями:

Передача значений между классами
Как передать значение int-овой переменной из одного класса в другой? Всё было...

Передача переменных между классами
Есть Main.java и Settings.java Settings.java содержит: public void...

Передача слова между классами
В классе мэйнактивити я прописываю время, когда должно появиться всплывающее...

Передача данных между Активити
Все никак не могу разобраться, как передавать данные между активити? я до этого...

Передача данных между активностями
к примеру есть 2 активности первая public class first_act extends Activity {...

3
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
19.07.2017, 06:43 2
Лучший ответ Сообщение было отмечено BargystVelp как решение

Решение

BargystVelp, засуньте базу в статику потомка application и она будет всегда доступна по всему проекту в одном экземпляре
1
shavuz
114 / 120 / 26
Регистрация: 29.01.2014
Сообщений: 596
19.07.2017, 11:46 3
Лучший ответ Сообщение было отмечено BargystVelp как решение

Решение

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

еще кое что:
Java
1
2
//Присвоили переменной context - this.
        context = this;
это делать не надо, это может привести к утечке памяти, контекст, он же This доступен во всей активити и у ее детей. не надо ее переписывать в переменную класса.
1
BargystVelp
2 / 2 / 2
Регистрация: 18.07.2017
Сообщений: 46
19.07.2017, 11:49  [ТС] 4
Всем спасибо, сегодня вечером попробую!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2017, 11:49

Передача данных между Activity1 3
1. надо сделать что бы из 1 окна передать данные на 3 окно 2. если честно я...

Передача данных между ListView
Доброго времени суток форумчане! Не получается решить одну проблему, надеюсь на...

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


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

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

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