0

I am making an application with 5 Fragments. In the activity with the Fragments, I get thd data from SharedPreferences and change the activity title. But in the Db.java file, where I connect to the database and execute queries, I can't get the data from SharedPreferences and get an error:

java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String android.content.SharedPreferences.getString(java.lang.String, java.lang.String)' on a null object reference at com.smartfon_apps.timetable_sch32.Db.getAllItemsFri(Db.java:77) at com.smartfon_apps.timetable_sch32.FridayFragment.onCreateView(FridayFragment.java:30) at android.support.v4.app.Fragment.performCreateView(Fragment.java:2074) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1286) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:758) at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1632) at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:637) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) at android.support.v4.view.ViewPager.populate(ViewPager.java:1237) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:668) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:630) at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:611) at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:2156) at android.support.design.widget.TabLayout.dispatchTabSelected(TabLayout.java:1138) at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1132) at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1105) at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1396) at android.support.design.widget.TabLayout$TabView.performClick(TabLayout.java:1501) at android.view.View$PerformClick.run(View.java:19844) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5349) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)

Here is my Db.java file:

package x.x.x;

import java.io.IOException;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.preference.PreferenceManager;
import android.util.Log;

public class Db {

    public static final String _ID_column = "_id";
    public static final String CLASS_COLUMN = "clas";
    public static final String NUMBER_COLUMN = "number";
    public static final String NAZVANIE_COLUMN = "nazvanie";
    public static final String DAY_COLUMN = "day";
    public static final String TIME_COLUMN = "time";
    public static final String ROOM_COLUMN = "room";
    public static final String TEACHER_COLUMN = "teacher";
    public static final String DATABASE_NAME = "lessons_database.db";
    public static final String TABLE_NAME = "lessonstable";
    private static final int DATABASE_VERSION = 1;

    private DbHelper mDbHelper;
    private SQLiteDatabase mDb;
    private SharedPreferences sp;

    public Db(Context context) {
        mDbHelper = new DbHelper(context);
    }

    public Cursor getAllItemsFri() {
        mDb = mDbHelper.getReadableDatabase();
        sp = PreferenceManager.getDefaultSharedPreferences();
        String select_class = sp.getString("select_class", "");
        //String select_class = "1А";
        String where = "clas = '" + select_class + "' AND day = 'Пятница'";
        return mDb.query(TABLE_NAME, null, where, null, null, null, null);
    }

    public void close() {
        if (mDbHelper != null) mDbHelper.close();
        if (mDb != null) mDb.close();
    }

    public class DbHelper extends SQLiteOpenHelper {

        public Context fContext;

        public DbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            fContext = context;
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL("CREATE TABLE " + TABLE_NAME + " ( "
                    + _ID_column + " INTEGER PRIMARY KEY AUTOINCREMENT, " + CLASS_COLUMN + " TEXT, " + NUMBER_COLUMN + " TEXT,"
                    + NAZVANIE_COLUMN + " TEXT, " + DAY_COLUMN + " TEXT,"
                    + TIME_COLUMN + " TEXT, " + ROOM_COLUMN + " TEXT,"
                    + TEACHER_COLUMN + " TEXT" + ");");

            // Добавляем записи в таблицу
            ContentValues values = new ContentValues();

            // Получим файл из ресурсов
            Resources res = fContext.getResources();

            // Открываем xml-файл
            XmlResourceParser _xml = res.getXml(R.xml.lessons_records);
            try {
                // Ищем конец документа
                int eventType = _xml.getEventType();
                while (eventType != XmlPullParser.END_DOCUMENT) {
                    // Ищем теги record
                    if ((eventType == XmlPullParser.START_TAG)
                            && (_xml.getName().equals("record"))) {
                        // Тег Record найден, теперь получим его атрибуты и
                        // вставляем в таблицу
                        String clas = _xml.getAttributeValue(1);
                        String number = _xml.getAttributeValue(2);
                        String nazv = _xml.getAttributeValue(3);
                        String day = _xml.getAttributeValue(4);
                        String time = _xml.getAttributeValue(5);
                        String room = _xml.getAttributeValue(6);
                        String teacher = _xml.getAttributeValue(7);

                        values.put("clas", clas);
                        values.put("number", number);
                        values.put("nazvanie", nazv);
                        values.put("day", day);
                        values.put("time", time);
                        values.put("room", room);
                        values.put("teacher", teacher);
                        db.insert(TABLE_NAME, null, values);
                    }
                    eventType =
                            _xml.next();
                }
            }
            // Catch errors
            catch (XmlPullParserException | IOException e) {
                Log.e("Test", e.getMessage(), e);
            } finally {
                // Close the xml file
                _xml.close();
            }

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            //Log.w("TestBase", "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            onCreate(db);
        }
    }
}

Here is my activity with the Fragments where everything is working:

import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

import java.util.ArrayList;
import java.util.List;

import com.smartfon_apps.timetable_sch32.R;
import com.smartfon_apps.timetable_sch32.MondayFragment;
import com.smartfon_apps.timetable_sch32.TuesdayFragment;
import com.smartfon_apps.timetable_sch32.WednesdayFragment;
import com.smartfon_apps.timetable_sch32.ThursdayFragment;
import com.smartfon_apps.timetable_sch32.FridayFragment;

import static com.smartfon_apps.timetable_sch32.Db.*;

public class TimetableActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    SharedPreferences sp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timetable);

        sp = PreferenceManager.getDefaultSharedPreferences(this);
        String select_class = sp.getString("select_class", "");

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        //getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        setTitle("Расписание " + select_class + " класса");

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new MondayFragment(), "ПН");
        adapter.addFragment(new TuesdayFragment(), "ВТ");
        adapter.addFragment(new WednesdayFragment(), "СР");
        adapter.addFragment(new ThursdayFragment(), "ЧТ");
        adapter.addFragment(new FridayFragment(), "ПТ");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
}

Any suggestions on how to solve this problem?

Phantômaxx
  • 37,901
  • 21
  • 84
  • 115

0 Answers0