Nuestros mejores programadores agotaron sus provisiones de café, por su búsqueda a tiempo completo por la respuesta, hasta que Alana halló el hallazgo en Bitbucket y ahora la compartimos contigo.
Solución:
La mejor manera es almacenar las fechas como un número, recibido mediante el comando Calendario.
//Building the table includes:
StringBuilder query=new StringBuilder();
query.append("CREATE TABLE "+TABLE_NAME+ " (");
query.append(COLUMN_ID+"int primary key autoincrement,");
query.append(COLUMN_DATETIME+" int)");
//And inserting the data includes this:
values.put(COLUMN_DATETIME, System.currentTimeMillis());
¿Por qué hacer esto? En primer lugar, obtener valores de un rango de fechas es fácil. Simplemente convierta su fecha en milisegundos y luego consulte adecuadamente. Ordenar por fecha es igualmente fácil. Las llamadas para convertir entre varios formatos también son fáciles, como he incluido. La conclusión es que, con este método, puede hacer cualquier cosa que necesite hacer, sin problemas. Será un poco difícil leer un valor sin procesar, pero compensa con creces esa pequeña desventaja al ser fácilmente legible y utilizable por una máquina. Y, de hecho, es relativamente fácil crear un lector (y sé que hay algunos) que convertirá automáticamente la etiqueta de tiempo a la fecha como tal para facilitar la lectura.
Vale la pena mencionar que los valores que surgen de esto deben ser largos, no enteros. Entero en sqlite puede significar muchas cosas, desde 1 a 8 bytes, pero para casi todas las fechas, 64 bits, o mucho, es lo que funciona.
EDITAR: como se ha señalado en los comentarios, debe usar el cursor.getLong()
para obtener correctamente la marca de tiempo si hace esto.
Puede usar un campo de texto para almacenar fechas dentro SQLite
.
Almacenamiento de fechas en formato UTC, el predeterminado si usa datetime('now')
(yyyy-MM-dd HH:mm:ss)
luego permitirá ordenar por la columna de fecha.
Recuperar fechas como cadenas de SQLite
luego puede formatearlos/convertirlos según sea necesario en formatos regionalizados locales utilizando el Calendario o el android.text.format.DateUtils.formatDateTime
método.
Aquí hay un método de formateador regionalizado que uso;
public static String formatDateTime(Context context, String timeToFormat)
String finalDateTime = "";
SimpleDateFormat iso8601Format = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
Date date = null;
if (timeToFormat != null)
try
date = iso8601Format.parse(timeToFormat);
catch (ParseException e)
date = null;
if (date != null) = android.text.format.DateUtils.FORMAT_SHOW_DATE;
flags
return finalDateTime;
- Como se presume en este comentario, siempre usaría números enteros para almacenar fechas.
-
Para almacenar, podría usar un método de utilidad
public static Long persistDate(Date date) if (date != null) return date.getTime(); return null;
al igual que:
ContentValues values = new ContentValues(); values.put(COLUMN_NAME, persistDate(entity.getDate())); long id = db.insertOrThrow(TABLE_NAME, null, values);
-
Otro método de utilidad se encarga de la carga.
public static Date loadDate(Cursor cursor, int index) if (cursor.isNull(index)) return null; return new Date(cursor.getLong(index));
se puede usar así:
entity.setDate(loadDate(cursor, INDEX));
-
Ordenar por fecha es una simple cláusula SQL ORDER (porque tenemos una columna numérica). Lo siguiente se ordenará de forma descendente (es decir, la fecha más reciente va primero):
public static final String QUERY = "SELECT table._id, table.dateCol FROM table ORDER BY table.dateCol DESC"; //... Cursor cursor = rawQuery(QUERY, null); cursor.moveToFirst(); while (!cursor.isAfterLast()) // Process results
Siempre asegúrese de guardar el Hora UTC/GMTespecialmente cuando se trabaja con java.util.Calendar
y java.text.SimpleDateFormat
que utilizan la zona horaria predeterminada (es decir, la de su dispositivo).
java.util.Date.Date()
es seguro de usar ya que crea un valor UTC.
Acuérdate de que puedes añadir una estimación justa si hallaste tu inconveniente .