Не удается открыть читаемую базу данных из фрагмента в Android

Я пытаюсь реализовать базу данных, как в следующем проекте

https://github.com/steventrigg/AlarmClock/tree/master/AlarmClock

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

Я получаю доступ к базе данных следующим способом

public AlarmModel getAlarm(long id) {
SQLiteDatabase db = this.getReadableDatabase(); //error is shown here
String select = "SELECT * FROM " + Alarm.TABLE_NAME + " WHERE " + Alarm._ID + " = " + id;

    Cursor c = db.rawQuery(select, null);

    if (c.moveToNext()) {
        return populateModel(c);
    }

    return null;
}

Мой фрагмент класса

public class AlarmListActivity extends Fragment {

private AlarmListAdapter=new AlarmDBHelper(getActivity());;
private AlarmDBHelper dbHelper;
private Context mContext;
ListView list;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    mContext = getContext();
    View view = inflater.inflate(R.layout.activity_alarm_list, container,
            false);
    list=(ListView) view.findViewById(R.id.listview);

    FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            startAlarmDetailsActivity(-1);

        }
    });

    mAdapter = new AlarmListAdapter(getActivity(),dbHelper.getAlarms(),AlarmListActivity.this);
    list.setAdapter(mAdapter);
    ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Alarm List");

    return view;
}



    public void setAlarmEnabled(long id, boolean isEnabled) {
    AlarmManagerHelper.cancelAlarms(getActivity());

    AlarmModel model = dbHelper.getAlarm(id);
    model.isEnabled = isEnabled;
    dbHelper.updateAlarm(model);

    AlarmManagerHelper.setAlarms(getActivity());
}

В logcat только он говорит, что не может получить читаемую базу данных.

2 ответа

Решение

Вставьте следующую строку в ваш onCreateView() метод. Не кладите его туда, куда положили.

private AlarmListAdapter=new AlarmDBHelper(getActivity());

Потому что он должен получить контекст вашей деятельности, который недоступен в области, которую вы объявили как getActivity() не вернет активность там.

"This" в this.getReadableDatabase ссылается на фрагмент - однако ему нужен контекст, который будет действием. try getActivity().getReadableDatabase(); в противном случае поместите следующий метод во фрагмент:

@Override
        public void onAttach(Activity activity) {
        a=activity;
        super.onAttach(activity);
        }

И объявить публичное поле

Activity a;

затем a.getReadableDatabase() в вашем методе

Другие вопросы по тегам