Не удается открыть читаемую базу данных из фрагмента в 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() в вашем методе