как получить столбец даты и месяца, используя базу данных объектной модели в Android

#java #android #sqlite #datetime

#java #Android #sqlite #дата и время

Вопрос:

Я добавил статическую дату в базу данных sqlite, и я получил эту дату и столбец месяца, используя объектную модель, и установил уведомление о дате и месяце предположим, что сегодня день рождения 4 человек, у меня есть уведомление об этом имени 4 человек, но ошибка у меня есть объект передачи для получения столбца даты и месяца, поэтому я получаю ошибку

Столбец моей базы данных

 DataType
TEXT                    Integer   Integer
Name                     dd         mm
"Indira Gandhi"         "19"        11
"Bal Gangadhar Tilak"   "23"        7
"Mangal Pandey"         "19"        7
  

Notification.java

 People people = new People();
    Calendar calendar = Calendar.getInstance();
    try {
        String str_date = people.getDate();
        Log.d(getClass().getName(), "strDate"   str_date);
        String str_month = people.getMonth();
        DateFormat formatter;
        Date date, month;
        formatter = new SimpleDateFormat("dd-MMM");
        date = (Date) formatter.parse(str_date);
        Log.d(getClass().getName(), "str_date"   date);
        month = (Date) formatter.parse(str_month);
        Log.d(getClass().getName(), "str_month"   month);
        calendar.setTime(date);
        calendar.setTime(month);
        calendar.set(Calendar.HOUR_OF_DAY, 10);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 0);
        calendar.setTime(month);
    } catch (ParseException e) {
        e.printStackTrace();
    }


    Intent intent1 = new Intent(Notification.this, MyReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getService(Notification.this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) Notification.this.getSystemService(Notification.this.ALARM_SERVICE);
    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
  

MyReceiver

 @Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub


        long when = System.currentTimeMillis();
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent notificationIntent = new Intent(context, NotificationOpen.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
            notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);


    Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
            context).setSmallIcon(R.drawable.birthday_icon)
            .setContentTitle("Alert Me!")
            .setContentText("Today is Birthday").setSound(alarmSound)
            .setAutoCancel(true).setWhen(when)
            .setContentIntent(pendingIntent)
            .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
    notificationManager.notify(0, mNotifyBuilder.build());


}
  

DatabaseHelper

  public List<People> getPeopleDate() {
    List<People> peoples = new ArrayList<>();

    try {
        SQLiteDatabase db = SQLiteDatabase.openDatabase(DB_PATH   DB_NAME, null, SQLiteDatabase.OPEN_READWRITE);
        Cursor cursor = db.rawQuery("select * from people", null);
        while (cursor.moveToNext()) {
            String peopleImage = cursor.getString(cursor.getColumnIndex(PEOPLE_IMAGE));
            String peopleName = cursor.getString(cursor.getColumnIndex(PEOPLE_NAME));

            String peopleDate = cursor.getString(cursor.getColumnIndex(PEOPLE_DATE));
            String peopleMonth = cursor.getString(cursor.getColumnIndex(PEOPLE_MONTH));
            String peopleYear = cursor.getString(cursor.getColumnIndex(PEOPLE_YEAR));

            People people = new People();

            people.setPeopleImage(peopleImage);
            people.setPeopleName(peopleName);

            people.setDate(peopleDate);
            people.setMonth(peopleMonth);
            people.setYear(peopleYear);

            peoples.add(people);
        }
    } catch (Exception e) {
        Log.d("DB", e.getMessage());
    }
    return peoples;
}
  

People.class

 public class People implements Serializable {
private String peopleImage;
private String peopleName;
private String id;
private String month, date, year;

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public String getMonth() {
    return month;
}

public void setMonth(String month) {
    this.month = month;
}

public String getYear() {
    return year;
}

public void setYear(String year) {
    this.year = year;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public void setPeopleName(String peopleName) {
    this.peopleName = peopleName;
}

public String getPeopleName() {
    return peopleName;
}

public void setPeopleImage(String peopleImage) {
    this.peopleImage = peopleImage;
}

public String getPeopleImage() {
    return peopleImage;
}
  

}

Комментарии:

1. Я думаю, вы пытаетесь преобразовать «ноябрь» в int. Что невозможно.

2. Ноябрь уже включен в обновление проверки статической базы данных Qu. @DheerubhaiBansal

3. @JaydeepDhamecha Пожалуйста, поделитесь классом People и полным описанием таблицы People

4. хорошо, я поделюсь

5. как вы можете сохранить строковое значение в целочисленном типе в mm.

Ответ №1:

Название месяца в целое число

Ваш вопрос и код довольно запутаны, но вы, похоже, зациклились на сохранении месяца в виде текста по его названию на английском языке.

Во-первых, не делайте этого, не сохраняйте месяц по его названию. Используйте простое целое число, 1-12 для января-декабря.

Но если вам необходимо, вы можете преобразовать английское название месяца в Month объект enum, поскольку объекты enum определяются с метками на английском языке. Из этого Month объекта запрашивается целое число месяца.

 Month m = Month.valueOf( "NOVEMBER" );
int monthNumber = m.getValue();
  

Это число плюс номер дня месяца могут быть использованы для получения MonthDay объекта и использованы способом, показанным в коде ниже.

 MonthDay md = MonthDay.of( monthNumber , dayOfMonthNumber );
  

ISO 8601

Сохраняйте повторяющуюся годовщину в виде комбинированного значения месяц-день в текстовом типе данных, используя стандартный формат ISO 8601: --MM-DD . Это стандартный формат даты, использующий дефис вместо года, YYYY-MM-DD . Преимущества этого формата включают в себя однозначное сопоставление с другими форматами даты и времени, а сортировка по алфавиту также является хронологической.

MonthDay

Класс java.time MonthDay представляет это значение дня месяца без указания года и часового пояса. Этот класс также знает, как генерировать и анализировать строки в этом стандартном формате, описанном выше.

 String mdString = myResultSet.getString( … );
MonthDay md = MonthDay.parse( mdString );
  

ZonedDateTime

Теперь получите сегодняшнюю дату. Для этого требуется часовой пояс, поскольку в любой данный момент дата варьируется по всему миру в зависимости от зоны.

 ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( z );
  

LocalDate

Из этого мы можем извлечь значение только для даты.

 LocalDate today = now.toLocalDate();
  

Получите текущий год, чтобы мы могли определить день рождения.

 int year = today.atYear();
LocalDate birthday= md.atYear( year );
  

Этот день рождения может быть в прошлом, и мы хотим будущего.

 if( ! birthday.isAfter( today ) ) {
    birthday = birthday.plusYears( 1 );
}
  

Duration

Получите промежуток времени между настоящим моментом и этим будущим днем рождения, создайте Duration . Очевидно, вашей системе сигнализации нужны миллисекунды. Итак, нам нужно время суток. Здесь мы рассмотрим первый момент дня. Но вы, вероятно, хотите, чтобы будильник срабатывал в более позднее время суток, чем в полночь!

 ZonedDateTime alarm = birthday.atStartOfDay();
Duration d = Duration.between( now , alarm );
long millis = d.toMillis();
  

Android

Большая часть функциональности java.time была перенесена на Java 6 и 7 в проекте ThreeTen-Backport. Далее адаптирован для Android в проекте ThreeTenABP.

Советы

Не называйте день месяца «датой», поскольку это неоднозначно. Следуйте именованию, указанному в классах java.time.

Не сохраняйте месяц как английское название. Проще сохранить целое число 1-12 за январь-декабрь. И в вашем Java-коде используйте Month объекты enum, а не текст или цифры.

Комментарии:

1. Но month — это класс уведомлений об отображении, проверьте мое изображение выше so и как реализовать этот код в моем коде @Basil Bourque

2. Я не могу понять ваш комментарий.

Ответ №2:

 String peopleDate = cursor.getString(cursor.getColumnIndex(PEOPLE_DATE));
            String peopleMonth = cursor.getString(cursor.getColumnIndex(PEOPLE_MONTH));
            String peopleYear = cursor.getString(cursor.getColumnIndex(PEOPLE_YEAR));
  

вы получаете вышеуказанные значения в виде строки (cursor.getString()), они определены как string или int?, Можете ли вы опубликовать запрос Create table.

Комментарии:

1. Я не создал таблицу, я получил значение из базы данных напрямую @Ankit Dubey

Ответ №3:

Много путаницы в вашем коде общего доступа, например:

 String peopleImage = cursor.getString(cursor.getColumnIndex(PEOPLE_IMAGE));
            String peopleName = cursor.getString(cursor.getColumnIndex(PEOPLE_NAME));

            String peopleDate = cursor.getString(cursor.getColumnIndex(PEOPLE_DATE));
            String peopleMonth = cursor.getString(cursor.getColumnIndex(PEOPLE_MONTH));
            String peopleYear = cursor.getString(cursor.getColumnIndex(PEOPLE_YEAR));

            People people = new People();

            people.setPeopleImage(peopleImage);
            people.setPeopleName(peopleName);

            people.setDate(peopleDate);
            people.setMonth(peopleMonth);
            people.setYear(peopleYear);

            peoples.add(people);
  

** Вы устанавливаете большое значение, но ваш класс People имеет только :**

 public class People implements Serializable {

 private String month, date;

  public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public String getMonth() {
    return month;
}

public void setMonth(String month) {
    this.month = month;
}
  

Итак, я предлагаю вам поделиться полным классом People и описанием таблицы.