Cómo obtener fechas de la base de datos y comprobar si se solapan?

Tengo una base de datos sqlite en la que almaceno todos los eventos. StartTime y EndTime en función de cada evento en formato de fecha.

Tengo fragmentos durante días con pestañas y una actividad que añade eventos. Los eventos se muestran en otros fragmentos.

Ahora quiero comprobar si los eventos se superponen entre sí y en función de qué aplicación debe mostrar un mensaje.

Cómo mostrar el mensaje en la actividad de eventos agregados cuando el usuario guarda los eventos.

¿Cómo puedo hacer esto?

He intentado esta manera pero los acontecimientos inmóviles se agregan con mismo tiempo del stat y hora del final:

  ImageButton imageButton = (ImageButton)findViewById(R.id.imgbtn_fab); imageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { eventTitle = title.getText().toString(); EventTableHelper db = new EventTableHelper(getApplication()); List<EventData> events; events = db.getAllEvents(); for (EventData eventData : events) { String datefrom = eventData.getFromDate(); String[] times = datefrom.substring(11, 16).split(":"); minutesFrom = Integer.parseInt(times[0]) * 60 + Integer.parseInt(times[1]); String dateTo = eventData.getToDate(); //times = dateTo.substring(11,16).split(":"); String[] times1 = dateTo.substring(11, 16).split(":"); minutesTo = Integer.parseInt(times1[0]) * 60 + Integer.parseInt(times1[1]); } if (eventTitle.length() == 0) { Toast.makeText(getApplicationContext(), "Title can not be empty.", Toast.LENGTH_LONG).show(); } else if(minutesFrom == minutesTo) { Toast.makeText(getApplicationContext(),"Event with same time exists.",Toast.LENGTH_LONG).show(); } else { db.addEvent(new EventData(eventTitle, startTime, endTime, dayOfWeek, location)); setResult(RESULT_OK, i); finish(); } } }); 

Tengo fechas como esta:

  c = Calendar.getInstance(); year = c.get(Calendar.YEAR); month = c.get(Calendar.MONTH); day = c.get(Calendar.DAY_OF_MONTH); hour = c.get(Calendar.HOUR_OF_DAY); minute = c.get(Calendar.MINUTE); df = new SimpleDateFormat("HH:mm a"); datefrom = c.getTime(); startTime = String.valueOf(datefrom); aTime = df.format(datefrom.getTime()); showFromTime.setText(aTime); c.add(Calendar.HOUR_OF_DAY, 1); dateto = c.getTime(); endTime = String.valueOf(dateto); bTime = df.format(dateto.getTime()); showToTime.setText(bTime); 

He creado EventTableHelper

 public class EventTableHelper extends SQLiteOpenHelper { private static final String TABLE = "event"; private static final String KEY_ID = "id"; private static final String KEY_TITLE = "title"; private static final String KEY_FROM_DATE = "datefrom"; private static final String KEY_TO_DATE = "dateto"; private static final String KEY_LOCATION = "location"; private static final String KEY_DAY_OF_WEEK = "dayofweek"; public EventTableHelper(Context context) { super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { } public void createTable(SQLiteDatabase db){ String CREATE_EVENTS_TABLE = "CREATE TABLE " + TABLE+ "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TITLE + " TEXT," + KEY_FROM_DATE + " DATE," + KEY_TO_DATE + " DATE," + KEY_DAY_OF_WEEK + " TEXT " + KEY_LOCATION + " TEXT" + ")"; db.execSQL(CREATE_EVENTS_TABLE); } // Upgrading database @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE); // createTable(db); // onCreate(db); } public void addEvent(EventData event) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_TITLE,event.getTitle()); values.put(KEY_FROM_DATE, event.getFromDate()); values.put(KEY_TO_DATE,event.getToDate()); values.put(KEY_DAY_OF_WEEK,event.getDayOfWeek()); values.put(KEY_LOCATION,event.getLocation()); db.insert(TABLE, null, values); db.close(); } EventData getEvent(int id) { SQLiteDatabase db = this.getReadableDatabase(); EventData eventData = new EventData(); Cursor cursor = db.query(TABLE, new String[]{KEY_ID, KEY_TITLE, KEY_FROM_DATE, KEY_TO_DATE, KEY_LOCATION}, KEY_ID + "=?", new String[]{String.valueOf(id)}, null, null, null, null); if( cursor != null && cursor.moveToFirst() ) { eventData = new EventData(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4)); } return eventData; } public List<EventData> getAllEvents() { List<EventData> conList = new ArrayList<EventData>(); String selectQuery = "SELECT * FROM " + TABLE; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); if (cursor.moveToFirst()) { do { EventData event = new EventData(); event.setId(Integer.parseInt(cursor.getString(0))); event.setTitle(cursor.getString(1)); event.setFromDate(cursor.getString(2)); event.setToDate(cursor.getString(3)); event.setLocation(cursor.getString(4)); conList.add(event); } while (cursor.moveToNext()); } return conList; } } 

Intenté utilizar la función de eventos getAll en una actividad para obtener datos. Por favor ayuda. Gracias..

Editar :: Código actual.

  @Override public void onClick(View v) { eventTitle = title.getText().toString(); EventTableHelper db = new EventTableHelper(getApplication()); List<EventData> events; // events = db.getOverlappingEvents(startTime,endTime); if (eventTitle.length() == 0) { Toast.makeText(getApplicationContext(), "Title can not be empty.", Toast.LENGTH_LONG).show(); } else if(db.doesEventOverlap(startTime,endTime)) { Toast.makeText(getApplicationContext(), "Event exists", Toast.LENGTH_LONG).show(); } else { db.addEvent(new EventData(eventTitle, startTime, endTime, dayOfWeek, location)); setResult(RESULT_OK, i); finish(); } } }); 

MinutesTo, minutesFrom sólo tendrá el valor para la última línea en el db.

Intentaría hacer una nueva función en EventTableHelper:

 List<EventData> getOverlappingEvents(Date startTime, Date endTime) { List<EventData> conList = new ArrayList<EventData>(); String selectQuery = "SELECT * FROM " + TABLE + " WHERE (" + KEY_FROM_DATE + " < '" + startTime + "' AND '" + startTime + "' < " + KEY_TO_DATE + ") OR " + " (" + KEY_FROM_DATE + " < '" + endTime + "' AND '" + endTime + "' < " + KEY_TO_DATE + ") OR " + " (" + KEY_FROM_DATE + " < '" + startTime + "' AND '" + endTime + "' < " + KEY_TO_DATE + ") OR " + " ('" + startTime + "' < " + KEY_FROM_DATE + " AND " + KEY_TO_DATE + " < '" + endTime + "')"; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); if (cursor.moveToFirst()) { do { EventData event = new EventData(); event.setId(Integer.parseInt(cursor.getString(0))); event.setTitle(cursor.getString(1)); event.setFromDate(cursor.getString(2)); event.setToDate(cursor.getString(3)); event.setLocation(cursor.getString(4)); conList.add(event); } while (cursor.moveToNext()); } return conList; } 

Y en onClick:

 events = db.getOverlappingEvents(); ... 

Y en lugar de:

 else if(minutesFrom == minutesTo) 

esta:

 else if(events.size() > 0) 

En realidad podría ser incluso más optimizado, ya que parece que no necesita los datos de eventos superpuestos, sólo un booleano si hay al menos un evento superpuesto:

 boolean doesEventOverlap(Date startTime, Date endTime) { String selectQuery = "SELECT COUNT(*) FROM " + TABLE + " WHERE (" + KEY_FROM_DATE + " < '" + startTime + "' AND '" + startTime + "' < " + KEY_TO_DATE + ") OR " + " (" + KEY_FROM_DATE + " < '" + endTime + "' AND '" + endTime + "' < " + KEY_TO_DATE + ") OR " + " (" + KEY_FROM_DATE + " < '" + startTime + "' AND '" + endTime + "' < " + KEY_TO_DATE + ") OR " + " ('" + startTime + "' < " + KEY_FROM_DATE + " AND " + KEY_TO_DATE + " < '" + endTime + "')"; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); if (cursor.moveToFirst()) { do { EventData event = new EventData(); return cursor.getInt(0) > 0; } while (cursor.moveToNext()); } return false; } 

Y en onClick en lugar de:

 else if(minutesFrom == minutesTo) 

esta:

 else if(db.doesEventOverlap()) 
  • Las imágenes transparentes de OpenGL tienen negro en ellas
  • Texto que no se muestra en la superposición de MapView
  • Captura de captura de pantalla en el teléfono Android durante la reproducción de vídeo y vista previa de la cámara
  • Dibuja rejilla sobre polígono en Google map V2
  • ¿Cómo almacenar en caché android.graphics.path o Bitmap cuando se usan Overlays?
  • Superposición transparente GLSurfaceview en la vista existente en android?
  • Android: configuración del relleno en un fondo de imagen de superposición
  • ¿Posible superponer un botón encima de otro?
  • Google maps api no coloca el marcador en la ubicación correcta
  • Mostrar una superposición de "ayuda" en un diseño de Android
  • Superposición de teclas de teclado de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.