#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 и описанием таблицы.