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

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

Войти
Регистрация
Восстановить пароль
 
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 166
Записей в блоге: 1
#1

Класс не видит ресурсы через контекст - Программирование Android

22.05.2016, 23:37. Просмотров 451. Ответов 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.BootstrapApplication: 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2016, 23:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс не видит ресурсы через контекст (Программирование Android):

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

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

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

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

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

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

2
Pablito
2476 / 1960 / 611
Регистрация: 12.05.2014
Сообщений: 6,863
Завершенные тесты: 1
23.05.2016, 12:54 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Java
1
2
3
4
5
 private Db(Context context) {
        super(context, DB_NAME, null, VERSION);
        this.context=context;
        getWritableDatabase();
    }
1
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 166
Записей в блоге: 1
23.05.2016, 13:07  [ТС] #3
Цитата Сообщение от Паблито Посмотреть сообщение
this.context=context;
getWritableDatabase();
Действительно, заработало! Спасибо!

Добавил в конструктор getWritableDatabase() т.к. БД SQLLite не создаётся пока что-нибудь не вызвать с getWritableDatabase(), но отдельный метод-заглушку с getWritableDatabase() в классе Db писать не хотел. Опытным путём просто добавил getWritableDatabase() без какой-либо ссылки в конструктор, но добавлять надо было после инициализации поля context.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2016, 13:07
Привет! Вот еще темы с ответами:

GDI. Вывод bmp через промежуточный совместимый контекст - C++ WinAPI
Почему не выводит картинку код типа: HDC hdc = GetDC(hWnd); HDC hMemDC1 = CreateCompatibleDC(hdc); HDC hMemDC2 =...

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

PPTP Server на Mikrotik RB750 не видит локальные ресурсы на другом конце - Mikrotik
Появилась задача поднять vpn(pptp) сервер на микротике(м 6.7). В принципе сам сервер поднял, в firewall прописал 1723 порт в исключения для...

Область видимости. один класс не видит другой класс - C++
Добрый день! такая проблема. Есть базовый класс Q. От него наследуется 2 класса Р и G. Класс P имеет два конструктора 1 принимает...


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

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

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