Доступ к данным в базе данных SQLite фрагментом - PullRequest
0 голосов
/ 04 января 2019

Я создал приложение для установки напоминаний. Для этого я использую два фрагмента: один для отображения списка напоминаний и другой для создания и редактирования конкретного напоминания.

Когда я редактирую напоминание, у меня возникают проблемы с отображением уже сохраненных данных из базы данных SQLite (кажется, что сохранение работает нормально). Мне удалось показать заголовок напоминания, отправив его из списка напоминаний с помощью аргументов. Тем не менее, я думаю, что было бы более разумно напрямую обращаться к базе данных из фрагмента редактирования. Я уже пробовал разные методы, но мне кажется, что я неправильно обращаюсь к классу ReminderProvider. Я попытался создать метод getTitel в классе ReminderProvider, который используется для обработки базы данных, но затем мне нужно будет создать экземпляр класса, и именно здесь я теряюсь, так как не создаю его экземпляр правильно (я получаю NPE). Я также хотел бы получить доступ к БД, чтобы показать дату и время, которые были сохранены ранее (я пока не смог решить это с помощью аргументов).

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

Я много искал здесь, но не нашел ответа (или не смог перенести его в мой случай). Я все еще новичок, поэтому я был бы признателен за любую помощь. Спасибо! (И извините, если это действительно глупый вопрос ...)

Мой код для классов ReminderEditFragment и ReminderProvider приведен ниже (у меня также есть следующие классы: ReminderListFragment, чтобы отобразить все напоминания, ReminderListActivity для обработки ListFragment, ReminderEditActivity, ReminderManager, OnAlarmReceiver, onBootderService ReceSigner for RecederSerceService ReceService Receder Receder Receder Receder Receder Receder Receder Receder RecederServiceService RecederSerceService для Resource RecendingSource Receder RecederServiceServiceSource RecederServiceService для получения квитанций). - и указатель времени)

ReminderEditFragment:

public class ReminderEditFragment extends Fragment implements  DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener {

  private static final String DATE_FORMAT = "yyyy-MM-dd";
  private static final String TIME_FORMAT = "kk:mm";

  private Calendar mCalendar;


  @Override
  public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
      mCalendar.set(Calendar.YEAR, year);
      mCalendar.set(Calendar.MONTH, monthOfYear);
      mCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
      updateButtons();
  }

  @Override
  public void onTimeSet(TimePicker view, int hour, int minute) {
    mCalendar.set(Calendar.HOUR_OF_DAY, hour);
    mCalendar.set(Calendar.MINUTE, minute);
    updateButtons();
  }

  private void updateButtons() {
    //Text des TimeButtons setzen
    SimpleDateFormat timeFormat = new SimpleDateFormat(TIME_FORMAT);
    String timeForButton = null;
    timeForButton = timeFormat.format(mCalendar.getTime());
    mTimeButton.setText(timeForButton);

    //Text des DateButtons setzen
    SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
    String dateForButton = null;
    dateForButton = dateFormat.format(mCalendar.getTime());
    mDateButton.setText(dateForButton);
  }


  public static final String DEFAULT_EDIT_FRAGMENT_TAG = "editFragmentTag";

  private EditText mReminderTitle;
  private Button mDateButton;
  private Button mTimeButton;
  private Button mConfirmButton;
  private Button mDeleteButton;
  private long mRowID;
  private TextView mTextOldDate;
  private TextView mOldDate;



  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle arguments = getArguments();
    if (arguments != null) {
        mRowID = arguments.getLong(ReminderProvider.COLUMN_ID);

    }
    if (savedInstanceState != null && savedInstanceState.containsKey(CALENDAR)) {
        mCalendar = (Calendar) savedInstanceState.getSerializable(CALENDAR);
    } else{
        mCalendar = Calendar.getInstance();
    }

  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.reminder_edit, container, false);

    mReminderTitle = v.findViewById(R.id.editText_reminder);

    mDateButton = v.findViewById(R.id.button_reminder_date);
    mTimeButton = v.findViewById(R.id.button_reminder_time);

    if (mRowID != 0) {

        Bundle arguments = getArguments();
        String reminderTitle = arguments.getString(ReminderProvider.COLUMN_TITLE);

        //I have also tried different versions of the following, but here I get the NPE
        //Cursor c = (Cursor) new ReminderProvider().getTitle(mRowID);
        //String reminderTitle = new ReminderProvider().getTitle(mRowID);

        mReminderTitle.setText(reminderTitle);

      }

      mConfirmButton = v.findViewById(R.id.button_confirm);
      mDeleteButton = v.findViewById(R.id.button_delete);

      mDateButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDatePicker();
        }
      });

      mTimeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick (View v) {
            showTimePicker();
        }

    });

      mConfirmButton.setOnClickListener (new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ContentValues values = new ContentValues();
            values.put(ReminderProvider.COLUMN_ID, mRowID);
            values.put(ReminderProvider.COLUMN_TITLE, mReminderTitle.getText().toString());
            values.put(ReminderProvider.COLUMN_DATE_TIME, mCalendar.getTimeInMillis());

            if (mRowID == 0) {
                Uri itemUri = getActivity().getContentResolver().insert(ReminderProvider.CONTENT_URI, values);
                mRowID = ContentUris.parseId(itemUri);
            } else {
                int count = getActivity().getContentResolver().update(ContentUris.withAppendedId(ReminderProvider.CONTENT_URI, mRowID),
                values, null, null);
                if (count != 1)
                    throw new IllegalStateException(mRowID + " konnte nicht aktualisiert werden.");
            }

            Toast.makeText(getActivity(), getString(R.string.task_saved_message), Toast.LENGTH_SHORT).show();
            getActivity().finish();

            new ReminderManager(getActivity()).setReminder(mRowID, mCalendar);

        }
    });

      mDeleteButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mRowID != 0) {
                getActivity().getContentResolver().delete(ContentUris.withAppendedId(ReminderProvider.CONTENT_URI, mRowID), null, null);
                Toast.makeText(getActivity(), getString(R.string.task_deleted_message), Toast.LENGTH_SHORT).show();
                getActivity().finish();
            }
        }
      });

      return v;
  }


  //Dialogkonstanten

  static final String YEAR = "year";
  static final String MONTH = "month";
  static final String DAY = "day";
  static final String HOUR = "hour";
  static final String MINS = "mins";
  static final String CALENDAR = "calendar";

  private void showDatePicker() {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    DialogFragment newFragment = new DatePickerDialogFragment();
    Bundle args = new Bundle();
    args.putInt(YEAR, mCalendar.get(Calendar.YEAR));
    args.putInt(MONTH, mCalendar.get(Calendar.MONTH));
    args.putInt(DAY, mCalendar.get(Calendar.DAY_OF_MONTH));
    newFragment.setArguments(args);
    newFragment.show(ft, "datePicker");
  }

  private void showTimePicker() {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    DialogFragment newFragment = new TimePickerDialogFragment();
    Bundle args = new Bundle();
    args.putInt(HOUR, mCalendar.get(Calendar.HOUR_OF_DAY));
    args.putInt(MINS, mCalendar.get(Calendar.MINUTE));
    newFragment.setArguments(args);
    newFragment.show(ft, "timePicker");
  }

  @Override
  public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    //Calendar-Instanz speichern, falls Aenderungen vorgenommen wurden
    outState.putSerializable(CALENDAR, mCalendar);
  }



}

ReminderProvider:

public class ReminderProvider extends ContentProvider {

  //ContentProvider URI und Quelle
  public static String AUTHORITY = "com.example.mareike.remindme2.ReminderProvider";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/reminder");

  //Fuer Begriffe oder Suche nach Definitionen verwendete MIME Typen
  public static final String REMINDERS_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.com.example.mareike.remindme2.reminder";
  public static final String REMINDER_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.com.example.mareike.remindme2.reminder";


  //Datenbank Konstanten
  private static final int DATABASE_VERSION = 1;
  private static final String DATABASE_NAME = "data";
  private static final String DATABASE_TABLE = "reminder";

  //Datenbanken Spalten
  public static final String COLUMN_ID = "_id";
  public static final String COLUMN_DATE_TIME = "reminder_date_time";
  public static final String COLUMN_TITLE = "title";

  //SQL Anweisung zusammensetzen
  private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE +
        " (" + COLUMN_ID + " integer primary key autoincrement, " + COLUMN_TITLE +
        " text not null, " + COLUMN_DATE_TIME + " integer not null);";

  //UriMatcher-Zeug
  private static final int LIST_REMINDER = 0;
  private static final int ITEM_REMINDER = 1;
  private static final UriMatcher sURIMatcher = buildUriMatcher();

  private SQLiteDatabase mDb;


  //Erstellt ein UriMatcher-Objekt fuer Suchvorschlaege und Kurzabfragen
  private static UriMatcher buildUriMatcher() {
    UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    matcher.addURI(AUTHORITY, "reminder", LIST_REMINDER);
    matcher.addURI(AUTHORITY, "reminder/#", ITEM_REMINDER);
    return matcher;
  }

  @Override
  public boolean onCreate() {
    mDb = new DatabaseHelper(getContext()).getWritableDatabase();
    return true;
  }

  @Override
  public Cursor query(Uri uri, String[] ignored1, String ignored2, String[] ignored3, String ignored4) {
    String[] projection = new String[]{ReminderProvider.COLUMN_ID, ReminderProvider.COLUMN_TITLE, ReminderProvider.COLUMN_DATE_TIME};

    //UriMatcher verwenden, um den Abfragetyp festzustellen und die Datenbankanfrage entsprechend zu formatieren

    Cursor c;
    switch(sURIMatcher.match(uri)) {
        case LIST_REMINDER:
            c = mDb.query(ReminderProvider.DATABASE_TABLE, projection, null, null, null, null, null);
            break;
        case ITEM_REMINDER:
            c = mDb.query(ReminderProvider.DATABASE_TABLE, projection, ReminderProvider.COLUMN_ID + "=?", new String[]{Long.toString(ContentUris.parseId(uri))},
                null, null, null, null);
            if (c != null && c.getCount() > 0) {
                c.moveToFirst();
            }
        break;
    default:
        throw new IllegalArgumentException("Unbekannte URI: " + uri);
    }

    c.setNotificationUri(getContext().getContentResolver(), uri);
    return c;
  }

  @Override
  public Uri insert (Uri uri, ContentValues values) {
    values.remove(ReminderProvider.COLUMN_ID);
    long id = mDb.insertOrThrow(ReminderProvider.DATABASE_TABLE, null, values);
    getContext().getContentResolver().notifyChange(uri, null);
    return ContentUris.withAppendedId(uri, id);
  }

  @Override
  public int delete(Uri uri, String ignored1, String[] ignored2) {
    int count = mDb.delete(ReminderProvider.DATABASE_TABLE, ReminderProvider.COLUMN_ID + "=?", new String[]{Long.toString(ContentUris.parseId(uri))});
    if (count > 0)
        getContext().getContentResolver().notifyChange(uri, null);
    return count;
  }

  @Override
  public int update(Uri uri, ContentValues values, String ignored1, String[] ignored2) {
    int count = mDb.update(ReminderProvider.DATABASE_TABLE, values, COLUMN_ID + "=?", new String[]{Long.toString(ContentUris.parseId(uri))});
    if (count > 0)
        getContext().getContentResolver().notifyChange(uri, null);
    return count;
  }

  //Methode zur Abfrage der unterstuetzten Typen. Sie wird auch in der Methode query() genutzt, um den Typ der empfangenen Uri festzustellen
  @Override
  public String getType(Uri uri) {
    switch (sURIMatcher.match(uri)) {
        case LIST_REMINDER:
            return REMINDERS_MIME_TYPE;
        case ITEM_REMINDER:
            return REMINDER_MIME_TYPE;
        default:
            throw new IllegalArgumentException("Unknown Uri: " + uri);
    }
  }

  //I also tried the following method(s) to be accessed from ReminderEditFragment
  //Methode, um mit ID Titel abzufragen
  //public Cursor fetchTitle (int id) {
  //    return mDb.rawQuery("SELECT title FROM data WHERE _id = " +id, null);
  //}

  public String getTitle(long id) {

    String stringTitle = "kein Titel vorhanden";
    int intId = (int)id;

    Cursor cursor = mDb.rawQuery ("SELECT title FROM data WHERE _id = " +id, null);
    if (cursor.moveToFirst()) {
        do {
            stringTitle = cursor.getString(cursor.getColumnIndex("title"));
        }
        while(cursor.moveToNext());
    }
    cursor.close();
   return stringTitle;
  }




  public class DatabaseHelper extends SQLiteOpenHelper {
    DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DATABASE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        throw new UnsupportedOperationException();
    }
  }

}

1 Ответ

0 голосов
/ 06 января 2019

Мне удалось решить проблему не с помощью constructur, а путем добавления метода запроса для каждого из трех полей с использованием content_uri в класс ReminderEditFragment:

public String savedDate (long id) {
    //Abfrage
    String[] projection = {
            ReminderProvider.COLUMN_ID,
            ReminderProvider.COLUMN_TITLE,
            ReminderProvider.COLUMN_DATE_TIME
    };


    Uri singleUri = ContentUris.withAppendedId(ReminderProvider.CONTENT_URI, mRowID);

    Cursor cursor = getActivity().getContentResolver().query(
            singleUri,
            projection,
            null,
            null,
            null);
    cursor.moveToFirst();

    //Date und Time setzen
    String dateS = cursor.getString(2);

    long dateJavaTimestamp = Long.parseLong(dateS);
    Date date = new Date(dateJavaTimestamp);

    String savedDate = new SimpleDateFormat(DATE_FORMAT).format(date);

    cursor.close();

    return savedDate;
}


public String savedTime (long id) {
    //Abfrage
    String[] projection = {
            ReminderProvider.COLUMN_ID,
            ReminderProvider.COLUMN_TITLE,
            ReminderProvider.COLUMN_DATE_TIME
    };


    Uri singleUri = ContentUris.withAppendedId(ReminderProvider.CONTENT_URI, mRowID);

    Cursor cursor = getActivity().getContentResolver().query(
            singleUri,
            projection,
            null,
            null,
            null);
    cursor.moveToFirst();

    //Date und Time setzen
    String dateS = cursor.getString(2);

    long dateJavaTimestamp = Long.parseLong(dateS);
    Date date = new Date(dateJavaTimestamp);

    String savedTime = new SimpleDateFormat(TIME_FORMAT).format(date);

    cursor.close();

    return savedTime;
}

Может быть, это поможет кому-то с подобной проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...