Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для arvalon
22 / 7 / 2
Регистрация: 26.10.2012
Сообщений: 212
Записей в блоге: 1

Класс не видит ресурсы через контекст

22.05.2016, 23:37. Показов 4227. Ответов 2
Метки нет (Все метки)

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

Приложение при первом запуске создаёт БД. Соответственно есть 2 класса-синглтона:
MyApplication унаследованный от Application - класс для преинициализации всего что мне нужно будет в дальнейшем, в т.ч. вызов класса Db;
Db унаследованный от SQLiteOpenHelper для работы с БД. Всё тривиально, реализованы методы onCreate и onUpgrade + мои собсвенные.

Я не хотел хардкодить SQL-инструкции ни в классе MyApplication ни в Db, а убрал их в string-array в в xml-файл с ресурсами в res\values-ru. Доступ к массиву получаем
Java
1
String[] groupArray = context.getResources().getStringArray(R.array.groups);
Так вот в классе MyApplication массив groupArray формируется нормально, а в классе Db нет. Если попытаться вызвать метод getResources() происходит ошибка:

java.lang.RuntimeException: Unable to create application com.android.tools.fd.runtime.BootstrapAp plication: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference

Но ведь я получаю контекст методом getApplicationContext() в классе MyApplication и передаю его параметром при вызове класса Db. Там в классе Db в конструкторе ссылка на контекст присваивается приватному полю context. По идее должно работать. Но нет.

Файл с массивом SQL-инсертов:
XML
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="groups">
        <item>Insert into groups (groups,group_runame) VALUES (\'string1\',\'string1\')</item>
          ................................................................................................................
        <item>Insert into groups (groups,group_runame) VALUES (\'string2\',\'string2\')</item>
    </string-array>
</resources>
MyApplication
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
package ru.arvalon.mytraining;
 
import android.app.Application;
import android.util.Log;
import android.widget.ArrayAdapter;
 
/**
 * Created by arvalon on 04.05.2016.
 */
public class MyApplication extends Application {
 
    private static  MyApplication singleton;
    private Db db;
 
    public static MyApplication getInstance(){
        return singleton;
    }
 
 
    @Override
    public void onCreate() {
        super.onCreate();
        singleton=this;
        db=Db.getInstance(getApplicationContext());
        
        String[] groupArray = getResources().getStringArray(R.array.groups); // ТУТ РАБОТАЕТ!
        for(int i=0;i<groupArray.length;i++){
            db.addGroup(groupArray[i]);
        }
    }
}
Класс Db
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
package ru.arvalon.mytraining;
 
import android.app.Application;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.Resources;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.ArrayAdapter;
 
public class Db extends SQLiteOpenHelper {
 
    private Context context;
    public static Db instance;
 
    private Db(Context context) {
        super(context, DB_NAME, null, VERSION);
        getWritableDatabase();
        this.context=context;
    }
 
    public static Db getInstance(Context context){
        if (instance==null){
            instance= new Db(context);
        }
        return instance;
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        
        String[] groupArray = context.getResources().getStringArray(R.array.groups); // НА ЭТОЙ СТРОЧКЕ ОШИБКА
       
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        
    }
 
    public void addGroup(String group){
        SQLiteDatabase db=getWritableDatabase();
        try {
            db.beginTransaction();
            db.execSQL(group);
 
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    }
}
Немного почистил классы от лишнего кода, оставил только прохождение к методу onCreate базы и строчку с ошибкой в нём.
Можете подсказать, почему не доступны ресурсы в классе Db, ошибка NullPointerException?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.05.2016, 23:37
Ответы с готовыми решениями:

Gradle и ресурсы - приложение не видит картинки
Всем привет. Написали адресную книгу. Имеет несколько дефолтных картинок. Структура проекта: src/main/java src/main/java ...

Android Studio - не видит ресурсы. Бред какой-то
http://************/7fr7xm Такая проблема, помогите

Второй класс не видит объекты на форме(Через Invoke)
Есть класс Cl1 - он вызывается из основного потока приложения. Этот класс работает в отдельном фоновом потоке, и ему нужно иногда обновлять...

2
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.05.2016, 12:54
Лучший ответ Сообщение было отмечено arvalon как решение

Решение

Java
1
2
3
4
5
 private Db(Context context) {
        super(context, DB_NAME, null, VERSION);
        this.context=context;
        getWritableDatabase();
    }
1
 Аватар для arvalon
22 / 7 / 2
Регистрация: 26.10.2012
Сообщений: 212
Записей в блоге: 1
23.05.2016, 13:07  [ТС]
Цитата Сообщение от Паблито Посмотреть сообщение
this.context=context;
getWritableDatabase();
Действительно, заработало! Спасибо!

Добавил в конструктор getWritableDatabase() т.к. БД SQLLite не создаётся пока что-нибудь не вызвать с getWritableDatabase(), но отдельный метод-заглушку с getWritableDatabase() в классе Db писать не хотел. Опытным путём просто добавил getWritableDatabase() без какой-либо ссылки в конструктор, но добавлять надо было после инициализации поля context.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.05.2016, 13:07
Помогаю со студенческими работами здесь

Программа не видит ресурсы
Добрый день. Я добавил в проект визуал студии 2010 ресурс и вот такой код: class Program { static void...

Через локальные компы mysql видит а через публичный ip не видит
Помогите пожалуйста ! Есть Mysql server через локальный компы работает перенаправил на рутере локальный ip чтоб можно было работать...

Возможно изменить контекст таблицы в БД через JTable?
Вывожу я таблицу (БД MySQL) в JTable и хочу отредактировать таблицу (БД MySQL) через JTable. Насколько это реально, возможно нужно...

Не могу достучаться до лога через контекст сервлета
Есть сервлет, а к нему фильтр, в фильтре пытаюсь написать хоть что-то в лог. В режиме отладки я вижу что doFilter вызываеться так что...

Asp.net development server не видит ресурсы css и изображения
разрабатываю проект в VS2010, использую asp.net development server. На одной единственной странице не работают стили и не распознаются...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru