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

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

Войти
Регистрация
Восстановить пароль
 
arvalon
15 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 96
#1

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

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

Android Как правильно передавать контекст
Android Полезные ресурсы
Android Ресурсы из интернета
При отладке через USB кабель Eclipse не видит планшет PMP7280C3G Android
Gradle и ресурсы - приложение не видит картинки Android
Android Studio - не видит ресурсы. Бред какой-то Android
Android Как лучше инициализировать контекст активити
Android Локальные ресурсы
Android Genymotion не видит мой проект при запуске через itelij IDEA
Android Передать ссылку на класс через Intent
Что передавать в параметр типа контекст? Android
Контекст равен null в АсинкТаске во фрагменте Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
2017 / 1759 / 548
Регистрация: 12.05.2014
Сообщений: 6,240
Завершенные тесты: 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();
    }
arvalon
15 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 96
23.05.2016, 13:07  [ТС]     Класс не видит ресурсы через контекст #3
Цитата Сообщение от Паблито Посмотреть сообщение
this.context=context;
getWritableDatabase();
Действительно, заработало! Спасибо!

Добавил в конструктор getWritableDatabase() т.к. БД SQLLite не создаётся пока что-нибудь не вызвать с getWritableDatabase(), но отдельный метод-заглушку с getWritableDatabase() в классе Db писать не хотел. Опытным путём просто добавил getWritableDatabase() без какой-либо ссылки в конструктор, но добавлять надо было после инициализации поля context.
Yandex
Объявления
23.05.2016, 13:07     Класс не видит ресурсы через контекст
Ответ Создать тему
Опции темы

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